我正在编写一个连接到Oracle 11g数据库并使用c3p0连接池的Java JDBC数据库应用程序。出于示例的目的,我有3个数据库用户DEFAULT,TOM和BILL。 c3p0使用DEFAULT数据库用户打开所有池化连接。我想从c3p0中检索一个池连接,并将Connection的用户更改为BILL而不是DEFAULT。是否可以在JDBC中执行此操作而不与数据库建立新连接?
我已经尝试过以下操作:
connect BILL/password;
但这不起作用。我收到错误说
java.sql.SQLException: ORA-00900: invalid SQL statement
还有其他选择吗?是否有与上下文设置或切换有关的内容可以促进我正在尝试做的事情?
谢谢!
答案 0 :(得分:5)
昨天研究后,我发现解决方案是使用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 */
如果还有其他细微差别,我不会感到惊讶,但这是一个好的开始。感谢大家的帮助!
答案 1 :(得分:1)
答案 2 :(得分:0)
如果这些用户没有通过您的应用程序以交互方式登录数据库,那么只有三个独立的池,每个用户一个池是不合理的吗?然后使用一些连接管理器来检索适当的连接?
答案 3 :(得分:0)
您可以使用DataSource.getConnection(String user, String password)
。 c3p0在内部为每个用户维护一个单独的池。
答案 4 :(得分:0)
c3p0与您告诉他使用的凭据建立物理连接,并且您无法在事实之后更改从池中获取的连接的凭据。如果要使用与不同数据库用户的连接,则需要创建和使用不同的池。
答案 5 :(得分:0)
您是否尝试通过jbdc发出此声明:
alter session set current_schema=BILL.
如果我没记错oracle结构,你连接的用户名与你正在使用的架构相同。
我在过去使用Oracle 10通过jdbc成功使用了上述语句。我的用户是root / admin用户,它拥有各种数据库模式的权限,我需要在同一个连接中切换它们。请注意,我不需要再次提供密码。
这听起来不像是一个非常安全的模型,所以我不知道它是否适合您的用例。