在JDBC连接上切换用户

我正在编写一个Java JDBC数据库应用程序,它连接到Oracle 11g数据库并使用c3p0连接池。 出于示例的目的,我有3个数据库用户DEFAULT,TOM和BILL。 c3p0使用DEFAULT数据库用户打开所有池化连接。 我想从c3p0中检索一个池连接,并将Connection的用户更改为BILL而不是DEFAULT。 是否可以在JDBC中执行此操作而不与数据库建立新连接?

我已经尝试过以下操作:

connect BILL/password; 

但这不起作用。 我说错了

 java.sql.SQLException: ORA-00900: invalid SQL statement 

还有其他选择吗? 是否有与上下文设置或切换有关的内容可以促进我正在尝试做的事情?

谢谢!

经过昨天的研究,我发现解决方案是使用Oracle代理身份validation。 此解决方案不在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 */ 

如果还有其他细微差别,我不会感到惊讶,但这是一个良好的开端。 谢谢大家的帮助!

检查

适用于Oracle VPD的JDBC扩展

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

很抱歉发布旧post,只想更新。

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

您可以使用DataSource.getConnection(String user, String password) 。 c3p0在内部为每个用户维护一个单独的池。

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

您是否尝试过通过jbdc发出此声明:

 alter session set current_schema=BILL. 

如果我没记错oracle结构,你连接的用户名与你正在使用的模式相同。

我之前通过jdbc成功地使用了上述语句与Oracle 10。 我的用户是root / admin用户,它拥有各种数据库模式的权限,我需要在同一个连接中切换它们。 请注意,我不需要再次提供密码。

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