代码之家  ›  专栏  ›  技术社区  ›  jtbradle

在JDBC连接上切换用户

  •  4
  • jtbradle  · 技术社区  · 16 年前

    我正在编写一个JavaJDBC数据库应用程序,它连接到Oracle 11g数据库,而AM使用C3P0连接池。在一个例子中,我有3个数据库用户默认值:Tom和Bill。c3p0打开与默认数据库用户的所有池连接。我想从c3p0中检索一个池连接,并将连接的用户更改为bill而不是default。是否可以在JDBC中这样做而不与数据库建立新的连接?

    我已尝试执行以下操作:

    connect BILL/password;
    

    但这不起作用。我有个错误说

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

    还有其他选择吗?是否有一些与上下文集或切换有关的东西可以帮助我尝试做什么?

    谢谢!

    6 回复  |  直到 13 年前
        1
  •  5
  •   jtbradle    16 年前

    经过昨天的研究,我发现解决方案是使用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 */
    

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

        2
  •  1
  •   Dhananjay    13 年前

    检查

    JDBC Extension for Oracle VPD

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

    很抱歉在旧线程上发布,只是想更新。

        3
  •  0
  •   Tim Reddy    16 年前

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

        4
  •  0
  •   axtavt    16 年前

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

        5
  •  0
  •   Pascal Thivent    16 年前

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

        6
  •  0
  •   Yoni    16 年前

    您是否尝试通过JBDC发布此声明:

    alter session set current_schema=BILL.
    

    如果我正确地记得Oracle结构,那么您连接的用户名与您正在使用的模式相同。

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

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