如何在java中执行sql查询之前更改数据库链接?

时间:2015-11-13 15:33:59

标签: java oracle jdbc

该应用程序使用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....

        }

});

3 个答案:

答案 0 :(得分:2)

您可以在模式中创建引用其他数据库上的表的同义词:

CREATE OR REPLACE SYNONYM "SOURCE_SCHEMA"."SYNONYM_NAME" FOR "TARGET_SCHEMA"."TARGET_TABLE"@"DBLINK"

这样您就可以通过同义词名称访问外部表,从而使您远离对象的确切物理位置:

SELECT * FROM SYNONYM_NAME

如果你想使用Hibernate映射这个实体,你可以像使用任何其他对象一样使用同义词名称。

答案 1 :(得分:0)

如果查询中的所有引用都是通过DB链接或完全限定的,那么您可以这样做:

  • 在(本地)Oracle数据库中创建新用户
  • 为该用户创建与您要替换的用户名相同的私有数据库链接
    • 如果原始数据库lniks是公共的,您只需重新定义要重定向的数据库链接,否则需要重新定义所有这些链接
  • 在Java应用程序中使用此数据库用户

私有数据库链接优先于同名的公共数据库链接,或者私有数据库链接显然会使用当前用户的链接。

答案 2 :(得分:0)

我只是初始化一个到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();