簡體   English   中英

如何在Java中執行SQL查詢之前更改數據庫鏈接?

[英]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映射此實體,則可以像使用其他任何對象一樣使用同義詞名稱。

如果查詢中的所有引用都是通過數據庫鏈接或完全限定的,則可以執行以下操作:

  • 在您的(本地)Oracle數據庫中創建一個新用戶
  • 為該用戶創建名稱與您要替換的名稱相同的私有數據庫鏈接
    • 如果原始數據庫lnik是公共的,則只需重新定義要重定向的數據庫鏈接,否則就需要重新定義所有它們。
  • 在Java應用程序中使用該數據庫用戶

專用數據庫鏈接將優先於同名的公用數據庫鏈接,或者對於專用數據庫鏈接,顯然將使用當前用戶的鏈接。

  1. 您可以為所有需要使用DB鏈接訪問的表創建同義詞。 創建這些鏈接,並將其放在您的連接模式中。 要么,
  2. 您可以編寫一種方法來解析userQuery,以確定該表是否已擁有或是否在數據庫鏈接的架構中,並在傳遞的查詢中將@DBLink相應地追加到表名。

我更喜歡方法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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM