【问题标题】:how to unwrap PostgreSQL connection from the IBM WSJdbc41Connection如何从 IBM WSJdbc41Connection 解开 PostgreSQL 连接
【发布时间】:2018-01-16 17:28:37
【问题描述】:

我一直在尝试从 IBM JNDI (WebSphere liberty) 中解开 PostgreSQL 连接,但运气不佳,请提供任何帮助:

         Context ctx = new InitialContext();
        DataSource dataSource = (DataSource) ctx.lookup("jdbc/indi");
        Connection cnx = dataSource.getConnection();

我得到了这个例外:

 java.lang.ClassCastException:
     com.ibm.ws.rsadapter.jdbc.v41.WSJdbc41Connection cannot be cast to
     org.postgresql.PGConnection

我试过了:

if(cnx.isWrapperFor(PGConnectionPoolDataSource.class)) {
        //unwrap
    }
    if (cnx.isWrapperFor(org.postgresql.ds.jdbc4.AbstractJdbc4SimpleDataSource.class)) {
            //unwrap
    }

    if (cnx.isWrapperFor(org.postgresql.core.v3.ConnectionFactoryImpl.class)) {
            //unwrap
    }
    if (cnx.isWrapperFor(org.postgresql.jdbc2.AbstractJdbc2Connection.class)) {
            //unwrap
    }
    if (cnx.isWrapperFor(org.postgresql.jdbc3.AbstractJdbc3Connection.class)) {
            //unwrap
    }

谢谢

【问题讨论】:

    标签: postgresql connection websphere-liberty


    【解决方案1】:

    如果您想将 JDBC 对象(DataSource、Connection 等)解包到特定于供应商的接口,则配置的 <datSource> 中的 JDBC 驱动程序必须对应用程序类加载器可用。配置将如下所示:

    <application location="oraclejdbcfat.war" >
        <!-- expose the 'DBLib' containing the JDBC driver jar to the app classloader -->
        <classloader commonLibraryRef="DBLib"/>
    </application>
    
    <library id="DBLib">
        <fileset dir="${server.config.dir}/postgresql/" includes="*.jar"/>
    </library>
    
    <dataSource jndiName="jdbc/myDS">
        <jdbcDriver libraryRef="DBLib"/>
        <properties .../>
    </dataSource>
    

    从那里,您可以像以前一样打开对象,即:

    DataSource ds = InitialContext.doLookup("jdbc/myDS");
    Connection conn = ds.getConnection();
    PGConnection pgConn = conn.unwrap(org.postgresql.PGConnection.class);
    

    另外,&lt;dataSource&gt; 配置上有一个 enableConnectionCasting 布尔属性,它会在 getConnection() 上自动为您调用 unwrap。

    <dataSource jndiName="jdbc/myDS" enableConnectionCasting="true">
    

    那么java代码就简单一点:

    DataSource ds = InitialContext.lookup("jdbc/indi");
    PGConnection pgConn = (PGConnection) ds.getConnection();
    

    【讨论】:

    • 嘿安迪。我厌倦了第一个选项并得到 java.sql.SQLFeatureNotSupportedException: Method org.postgresql.jdbc4.Jdbc4Connection.isWrapperFor(Class>) is not yet implemented。
    • 第二个选项:java.lang.ClassCastException: com.sun.proxy.$Proxy47 无法转换为 org.postgresql.PGConnection
    • Connection.isWrapperFor(Class&lt;?&gt;) 类自 4.0(几年)以来一直在 JDBC 规范中,我可以在 postgresql 代码中看到他们确实实现了这个方法:github.com/pgjdbc/pgjdbc/blob/REL9_4_1201/org/postgresql/jdbc4/… 所以这意味着你正在使用postresql JDBC 驱动程序的真正旧版本,需要更新到更新版本
    • 有意义我使用的是 9.1 我会更新它并再次检查
    • 安迪,你知道我如何获得这些课程
    猜你喜欢
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 2019-12-09
    • 2018-12-03
    • 2014-11-27
    相关资源
    最近更新 更多