如何从 IBM WSJdbc41Connection 解包 PostgreSQL 连接
how to unwrap PostgreSQL connection from the IBM WSJdbc41Connection
我一直在尝试从 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
}
谢谢
如果您想将 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);
此外,<dataSource>
配置上有一个 enableConnectionCasting
布尔属性,它会在 getConnection()
时自动为您调用解包。
<dataSource jndiName="jdbc/myDS" enableConnectionCasting="true">
那么java代码简单一点:
DataSource ds = InitialContext.lookup("jdbc/indi");
PGConnection pgConn = (PGConnection) ds.getConnection();
我一直在尝试从 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
}
谢谢
如果您想将 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);
此外,<dataSource>
配置上有一个 enableConnectionCasting
布尔属性,它会在 getConnection()
时自动为您调用解包。
<dataSource jndiName="jdbc/myDS" enableConnectionCasting="true">
那么java代码简单一点:
DataSource ds = InitialContext.lookup("jdbc/indi");
PGConnection pgConn = (PGConnection) ds.getConnection();