【问题标题】:Default Schema in Oracle Connection URLOracle 连接 URL 中的默认模式
【发布时间】:2011-01-22 03:42:17
【问题描述】:

我想在Oracle Connection URL中设置默认数据库架构

jdbc:oracle:thin:@<server>:<port1521>:<sid>

我的示例 SQL 语句:

select monkey_name from animals.monkey

我需要查询没有架构前缀 animals. 的数据库,即当我运行此语句时

select monkey_name from monkey

默认使用animals 架构。

我需要在上面的连接 URL 中指定什么才能达到这样的效果?

谢谢。

【问题讨论】:

    标签: oracle jdbc connection-string


    【解决方案1】:

    您不能在连接 URL 中添加任何内容。

    在 Oracle 中,每个用户都有自己的架构(即使不包含任何对象),这是他们的默认架构。登录/连接后,他们可以使用

    ALTER SESSION SET CURRENT_SCHEMA=animals
    

    所以你需要在连接后做额外的声明。 可以在用户和/或数据库上有一个登录触发器,当他们登录时将运行它。我个人更喜欢在应用程序连接时明确声明。

    【讨论】:

    • 这看起来我可以解决它。使用此语句创建登录触发器可能是我可能的解决方案。谢谢。
    • 我现在可以看到,这应该是一个解决方案。通过使用此登录触发器,我不必修改我的 sql。所以所有通用语句仍然是可移植的。
    【解决方案2】:

    如果您使用C3PO,您可以在检查连接时执行此操作。

    作为属性:

    c3p0.preferredTestQuery=alter session set current_schema=animals
    c3p0.testConnectionOnCheckout=true
    

    作为 Java 代码:

    ComboPooledDataSource dataSource = new ComboPooledDataSource();
    dataSource.setPreferredTestQuery("alter session set current_schema=animals");
    dataSource.setTestConnectionOnCheckout(true);
    

    缺点是每次从池中取出连接时都会发生这种情况。

    如果您自己使用 JDBC 连接,您可以这样做:

    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection connection = getConnection("jdbc:oracle:thin:@//server:1521/instance",   "username", "password");
    connection.createStatement().execute("alter session set current_schema=animals"));
    

    【讨论】:

    • 我需要给实例用户任何权限吗?我正在通过 localhost 访问 oracle,"jdbc:oracle:thin:@localhost:1521:xe" 此连接有效,但是当我尝试使用创建的用户更改 xe 时,它​​无法连接并出现错误 ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
    【解决方案3】:

    如何使用同义词?

    create synonym monkey for animals.monkey;
    
    select monkey_name from monkey
    

    【讨论】:

    • 这是个好主意。但是我发现它并不确定,我不确定是否有任何副作用可能会破坏事情。
    • 这通常是比更改会话更好的选择,因为它将问题从行为方面转移到结构方面,结构更加强大。
    • 虽然这在大多数情况下确实有效,但在许多公司环境中,单个数据库中会存在多个应用程序模式。如果原始表名不是使用前缀创建的,则会发生命名空间冲突。 e.g. MY_APP_PREFIX_USER(通常更简洁)很多人觉得这很难看,并且更喜欢默认模式的概念而不是同义词。
    • coderathet,如果您使用公共同义词,那将是正确的。始终建议尽可能使用私有同义词,以避免此类名称冲突。
    【解决方案4】:

    您可以使用连接数据库用户创建触发器来更改当前架构。

    create or replace trigger SET_SCHEMA_AFTER_LOGON
        after logon on database
    begin
         execute immediate 'alter session set CURRENT_SCHEMA=animals';
    end SET_SCHEMA_AFTER_LOGON;
    

    【讨论】:

      【解决方案5】:

      自 Java 1.7 起,java.sql.Connection 上有一个 setSchema 方法。

      在 Oracle 的 oracle.jdbc.driver.PhysicalConnection 实现中,此方法执行 alter session set current_schema = ? 语句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-11
        • 2021-09-01
        • 2021-07-17
        • 2015-10-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多