Oracle连接URL中的默认架构

Oracle连接URL中的默认架构,oracle,jdbc,connection-string,Oracle,Jdbc,Connection String,我想在Oracle连接URL jdbc:oracle:thin:@<server>:<port1521>:<sid> 我需要查询不带模式前缀的数据库。动物。即当我运行此语句时 select monkey_name from monkey 默认情况下,它将使用动物模式 我需要在上面的连接URL中指定什么才能获得这样的效果 谢谢。您不能在连接URL中放置任何内容 在Oracle中,每个用户都有自己的模式(即使不包含任何对象),这是他们的默认模式。登录/连接后,

我想在
Oracle连接URL

jdbc:oracle:thin:@<server>:<port1521>:<sid>
我需要查询不带模式前缀的数据库。动物。即当我运行此语句时

select monkey_name from monkey
默认情况下,它将使用
动物
模式

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


谢谢。

您不能在连接URL中放置任何内容

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

ALTER SESSION SET CURRENT_SCHEMA=animals
因此,在连接之后,您需要执行额外的语句。
用户和/或数据库上可能有一个登录触发器,当他们登录时将运行该触发器。我个人更喜欢在应用程序连接时使用显式语句

同义词的用法如何

create synonym monkey for animals.monkey;

select monkey_name from monkey
如果您使用,您可以让它在检查连接时执行此操作

作为属性:

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"));

您可以使用connection DB user创建触发器来更改当前架构

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;
自Java1.7以来,在
Java.sql.Connection
上有一个方法


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

这是个好主意。然而,我发现这一点并不确定,我不确定是否有任何副作用会破坏整个过程。这通常是比改变会议更好的选择,因为它将问题从行为方面转移到结构方面,这更为稳健。尽管这在大多数情况下都有效,在许多公司环境中,单个数据库中会存在多个应用程序模式。如果未使用前缀创建原始表名,则将发生命名空间冲突
例如MY_APP_PREFIX_USER
(通常更简洁)许多人觉得这很难看,他们更喜欢默认模式的概念而不是同义词。coderathet,如果使用公共同义词,这是真的。尽可能使用私有同义词是明智的,这样可以避免这样的名称冲突。这似乎是我可以解决的问题。使用此语句创建登录触发器可能是我可能的解决方案。谢谢。我现在明白了,这应该是一个解决方案。通过使用此登录触发器,我不必修改sql。所以所有的泛型语句仍然是可移植的。我需要给实例用户任何特权吗?我正在通过localhost访问oracle,
“jdbc:oracle:thin:@localhost:1521:xe”
此连接有效,但当我尝试使用创建的用户更改xe时,它无法连接,出现错误
ORA-12505,TNS:listener当前不知道连接描述符中给出的SID
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;