jdbc中的kerberos身份验证和连接池

jdbc中的kerberos身份验证和连接池,jdbc,oracle11g,connection-pooling,c3p0,kerberos-delegation,Jdbc,Oracle11g,Connection Pooling,C3p0,Kerberos Delegation,我已经通过SPNEGO/Kerberos在Tomcat上运行了Java web应用程序,其中包含SSO,我希望将Kerberos票证传递给数据库,在我的例子中是Oracle DB(就像MS产品中的模拟)。我发现了一个实现()的示例: Connection conn = (Connection)Subject.doAs(specificSubject, new PrivilegedExceptionAction({ public Object run() { Connection c

我已经通过SPNEGO/Kerberos在Tomcat上运行了Java web应用程序,其中包含SSO,我希望将Kerberos票证传递给数据库,在我的例子中是Oracle DB(就像MS产品中的模拟)。我发现了一个实现()的示例:

Connection conn = (Connection)Subject.doAs(specificSubject, new PrivilegedExceptionAction({
   public Object run() {
   Connection con = null;
   Properties prop = new Properties();
   prop.setProperty(AnoServices.AUTHENTICATION_PROPERTY_SERVICES,"("+AnoServices.AUTHENTICATION_KERBEROS5 + ")");
   try {
    OracleDriver driver = new OracleDriver();
    con = driver.connect(url, prop);
    }catch (Exception except){
    except.printStackTrace();
    }
    return con;
    }
    }); 
    String auth = ((OracleConnection)conn).getAuthenticationAdaptorName();
    System.out.println("Authentication adaptor="+auth);
    printUserName(conn);
    conn.close();


但众所周知,创建新连接是一项昂贵的操作。为了解决这个问题,通常使用连接池(如c3p0),但我找不到如何将上面的代码和连接池结合起来的示例。有什么例子吗?

嗨。很抱歉响应延迟,但要解决您的问题,请从连接池(如c3p0)获取连接,然后使用JDBC 4中的unwrap(…)方法获取底层OracleConnection。(如果您使用的是比c3p0-0.9.5-preX更旧的c3p0版本,则需要使用c3p0的原始连接操作)Hi。我不能完全理解提议的解决方案。假设我在池中有一些连接,这些连接是由某个技术用户建立的。所以我获取了其中一个,打开到底层的OracleConnection,然后我该怎么做?如何传递到这个连接的票证?我真的不能在Kerberos方面帮你;我只是不太清楚。但是,在上面的代码片段中,您可以轻松地使用c3p0数据源执行所有操作,并在必要时对底层Oracle连接进行展开。您可以使用解析为该驱动程序的JDBCURL,而不是直接使用OracleDriver。要连接
props
,您需要在与c3p0数据源关联的Properties对象中设置相同的值。