[英]How to change db link before executing a sql query in java?
該應用程序使用Spring和Hibernate。
是否可以在Java中執行sql查詢之前更改dblink ? 是本機JDBC還是Hibernate?
我知道有可能
通過將@dblink附加到表或視圖名稱來引用其他數據庫上的表或視圖
但是我無法做到這一點,因為sql查詢是由用戶編寫的,並且我無法控制它(解析它太復雜了)。
上面的代碼顯示了我正在嘗試做的...
// TODO connect to the db link ???
List<Object> results = this.getSession().doReturningWork(new ReturningWork<Object>(){
@Override
public String execute(Connection connection) throws SQLException
{
final ResultSet rs = connection.createStatement().executeQuery(userQuery);
// doing something with results....
}
});
您可以在架構中創建引用另一個數據庫上的表的同義詞:
CREATE OR REPLACE SYNONYM "SOURCE_SCHEMA"."SYNONYM_NAME" FOR "TARGET_SCHEMA"."TARGET_TABLE"@"DBLINK"
這樣,您可以通過同義詞名稱訪問外部表,從而使您不受對象的確切物理位置的影響:
SELECT * FROM SYNONYM_NAME
如果要使用Hibernate映射此實體,則可以像使用其他任何對象一樣使用同義詞名稱。
如果查詢中的所有引用都是通過數據庫鏈接或完全限定的,則可以執行以下操作:
專用數據庫鏈接將優先於同名的公用數據庫鏈接,或者對於專用數據庫鏈接,顯然將使用當前用戶的鏈接。
我更喜歡方法1,因為使用復雜的查詢可能很難實現2
您是否有理由要刪除同義詞?
我只是初始化與dblink的新連接。 由於用戶名是唯一的,因此可以使用。
final Configuration configuration = new Configuration();
configuration.setProperty("hibernate.connection.url", jdbcUrl);
configuration.setProperty("hibernate.connection.username", userDbLinkName);
configuration.setProperty("hibernate.connection.password", userDbLinkPassword);
final StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
final SessionFactory sessionFactory = configuration.buildSessionFactory(builder.build());
return sessionFactory.openSession();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.