Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中执行sql查询之前更改db链接?_Java_Oracle_Jdbc - Fatal编程技术网

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

如何在java中执行sql查询之前更改db链接?,java,oracle,jdbc,Java,Oracle,Jdbc,该应用程序使用Spring和Hibernate 在Java中执行sql查询之前,是否可以进行更改?是本机JDBC还是Hibernate 我知道有可能 通过将@dblink附加到另一个数据库来引用另一个数据库上的表或视图 表或视图名称 但我不能这样做,因为sql查询是由用户编写的,我无法控制它(解析它太复杂了) 上面的代码显示了我正在尝试做什么 // TODO connect to the db link ??? List<Object> results = this.getSess

该应用程序使用Spring和Hibernate

在Java中执行sql查询之前,是否可以进行更改?是本机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....

        }

});
//如何连接到数据库链接???
列表结果=this.getSession().doReturningWork(新的ReturningWork()){
@凌驾
公共字符串执行(连接)引发SQLException
{
最终结果集rs=connection.createStatement().executeQuery(用户查询);
//做一些有结果的事情。。。。
}
});

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

CREATE OR REPLACE SYNONYM "SOURCE_SCHEMA"."SYNONYM_NAME" FOR "TARGET_SCHEMA"."TARGET_TABLE"@"DBLINK"
这样,您就可以通过同义词名称访问外部表,从而避免对象的确切物理位置:

SELECT * FROM SYNONYM_NAME

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

如果查询中的所有引用都是通过DB链接或完全限定的,则可以执行以下操作:

  • 在(本地)Oracle数据库中创建新用户
  • 为该用户创建与要替换的用户同名的专用数据库链接
    • 如果原始DB LNIK是公共的,则只需重新定义要重定向的DB链接,否则需要重新定义所有这些链接
  • 在Java应用程序中使用此DB用户
私有数据库链接将优先于同名的公共数据库链接,或者对于私有数据库链接,显然将使用当前用户的数据库链接

  • 您可以为需要使用DB link访问的所有表创建同义词。创建这些链接,让它们出现在连接模式中。或者
  • 您可以编写一个方法来解析userQuery,以确定该表是属于自己的还是在DB link的模式中,并在传递的查询中将@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();
    

    您可以直接连接到目标数据库而不是dblink,并避免使用@dblink注释。但这是一个真实的数据库吗?我不知道JDBCURL驱动程序应该放什么
    jdbc:oracle:thin:@/:1521/
    ?我只有db_链接、用户名、密码和主机。在Java中执行sql查询之前,您所说的更改dblink是什么意思?根据我的理解,您希望连接到数据库(仅使用@dblink)并执行查询以获取结果集,对吗?是的,但可能还有其他解决方案,如下面的帖子所示(尚未测试)。对于连接,我不知道在JDBCURL中放什么…是的,用户不使用@dblink编写select。他们通过在组合框中选择一个来选择数据库链接,然后sql查询必须在正确的数据库链接上执行。听起来不错,你知道创建同义词(检索结果的时间)然后删除它是否干净吗?如果这是一个要求,应该不会有问题,Clemzd。这不是一个复杂的过程,就像在经过更多思考后创建一个物化视图一样,它无法工作。创建同义词时,请指定表。但是我不能得到这些信息,因为sql查询是由用户编写的。对于运行毫秒的简单查询,创建和删除同义词会带来巨大的性能和资源开销。此外,由于隐式提交,您将无法使用事务。使用这种方法,您应该为远程数据库中的每个可能的表创建一个同义词。然后,您应该编写一个过程,根据所需的dblink更改所有同义词。然后可以运行查询,但一次只能运行一个查询:不能在不同的数据库中并行运行查询。