Java 在JDBC连接上切换用户

Java 在JDBC连接上切换用户,java,jdbc,oracle11g,ora-00900,Java,Jdbc,Oracle11g,Ora 00900,我正在编写一个连接到Oracle11g数据库的JavaJDBC数据库应用程序,并且正在使用c3p0连接池。在本例中,我有3个数据库用户DEFAULT、TOM和BILL。c3p0使用默认数据库用户打开所有池连接。我想从c3p0中检索一个池连接,并将连接的用户更改为BILL而不是DEFAULT。在JDBC中不建立与数据库的新连接就可以做到这一点吗 我已经尝试过做以下工作: connect BILL/password; 但这是行不通的。我听到一个错误说 java.sql.SQLException:

我正在编写一个连接到Oracle11g数据库的JavaJDBC数据库应用程序,并且正在使用c3p0连接池。在本例中,我有3个数据库用户DEFAULT、TOM和BILL。c3p0使用默认数据库用户打开所有池连接。我想从c3p0中检索一个池连接,并将连接的用户更改为BILL而不是DEFAULT。在JDBC中不建立与数据库的新连接就可以做到这一点吗

我已经尝试过做以下工作:

connect BILL/password;
但这是行不通的。我听到一个错误说

java.sql.SQLException: ORA-00900: invalid SQL statement
还有其他选择吗?是否有一些与上下文设置或切换有关的东西可以帮助我尝试做什么


谢谢

如果这些用户没有通过您的应用程序以交互方式登录到数据库,那么仅仅拥有三个单独的池(每个用户一个)是否不合理?然后使用一些连接管理器来检索适当的连接?

您可以使用
DataSource.getConnection(字符串用户,字符串密码)
。c3p0在内部为每个用户维护一个单独的池。

c3p0使用您告诉他要使用的凭据创建物理连接,并且您不能在事实发生后更改从池中获得的连接的凭据。如果要使用与不同数据库用户的连接,则需要创建和使用不同的池。

您是否尝试通过jbdc发出此语句:

alter session set current_schema=BILL.
如果我没有记错oracle结构,那么您连接的用户名与您正在使用的模式相同

我确实在过去通过jdbc成功地将上述语句用于Oracle10。我的用户是root/admin用户,它拥有各种数据库模式的权限,我需要在同一连接中在它们之间切换。请注意,我不需要再次提供密码


这听起来不像是一个非常有安全意识的模型,所以我不知道它是否适合您的用例。

昨天研究之后,我发现解决方案是使用Oracle代理身份验证。此解决方案不在JDBC规范的范围内。然而,Oracle提供了一个钩子来实现这样的解决方案。打开代理连接如下所示:

import oracle.jdbc.OracleConnection;    

//Declare variables
String url = "...";
String username = "...";
String password = "...";

//Create the Connection
Connection conn = DriverManager.getConnection(url, username, password);

//Set the proxy properties
java.util.Properties prop = new java.util.Properties();
prop.put(OracleConnection.PROXY_USER_NAME, "BILL");
prop.put(OracleConnection.PROXY_USER_PASSWORD, "password");

//Cast the Connection to an OracleConnection and create the proxy session
((OracleConnection)conn).openProxySession(OracleConnection.PROXYTYPE_USER_NAME, prop);

/* The Connection credentials have now been changed */
如果有其他细微差别与此相关,我不会感到惊讶,但这是一个良好的开端。谢谢大家的帮助

检查

设置OracleConnection.clientIdentifier看起来更标准/更适合我


很抱歉在旧帖上发帖,只是想更新一下。

我考虑过这一点,但对我来说没有那么大的好处。本例中的3个用户仅用于示例目的。然而,在生产中,我预计会有大量的用户。谢谢@jtbradle您能澄清您的用例吗?这是针对客户机/服务器应用程序的吗?是的,这是针对客户机/服务器应用程序的。它适用于web应用程序,其中web应用程序的每个用户都有一个单独的数据库帐户。此web应用程序以前使用单点登录进行操作,但出于安全原因,我们将不再使用单点登录,而是使用多点登录解决方案。因此,这就是我的连接池问题所在。嗯。。。我很困惑。C/S还是web应用程序?对不起…web应用程序。谢谢,Yoni。不幸的是,我认为你的后一个假设是正确的。这不适合我的用例。set current_schema调用会更改默认模式…但是所有操作都是在原始用户的权限下运行的。这主意不错,但我想这对更改当前用户没有帮助。V$SESSION.Client_标识符已更改,但未更改V$SESSION.username有趣的功能,但我刚刚看到在使用openProxySession时,TNS数据包中以明文形式发送“代理用户名/密码”。