代码之家  ›  专栏  ›  技术社区  ›  Joe Kel

如何从IBM WSJdbc41Connection中打开PostgreSQL连接

  •  1
  • Joe Kel  · 技术社区  · 7 年前

    我一直在尝试从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
        }
    

    谢谢

    1 回复  |  直到 7 年前
        1
  •  0
  •   Andy Guibert    7 年前

    如果要将JDBC对象(数据源、连接等)展开到特定于供应商的接口,请配置 <datSource> 必须对应用程序类加载器可用。配置如下所示:

    <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);
    

    此外,还有 enableConnectionCasting 启用布尔属性 <dataSource> 配置,该配置将在 getConnection() .

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

    那么java代码就简单了一些:

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