4

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

我已经尝试过执行以下操作:

connect BILL/password;

但这不起作用。我收到一条错误消息

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

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

谢谢!

4

6 回答 6

5

经过昨天的研究,我发现解决方案是使用Oracle Proxy Authentication。此解决方案不属于 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 */

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

于 2010-01-15T14:51:42.967 回答
1

查看

Oracle VPD 的 JDBC 扩展

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

不好意思发到旧帖了,刚想更新。

于 2012-08-14T15:41:05.093 回答
0

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

于 2010-01-14T18:25:19.683 回答
0

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

于 2010-01-14T18:37:07.350 回答
0

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

于 2010-01-14T18:49:44.470 回答
0

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

alter session set current_schema=BILL.

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

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

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

于 2010-01-14T20:16:49.053 回答