我正在编写一个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代理身份验证.此解决方案不在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 */
如果还有其他细微差别,我不会感到惊讶,但这是一个良好的开端.谢谢大家的帮助!