WSJDBCConnection 不包装 Oracle jdbc Connection 类型的对象



我正在使用 Websphere liberty 服务器来运行我的应用程序,我需要使用ArrayDescriptor将数组传递给 oracle 存储过程。我在解开连接包装时出现异常。我也检查了连接元数据驱动程序信息,它向我显示了oracle.jdbc驱动程序。代码在连接解包行时失败。

Connection conn = this.getDataSource().getConnection();
OracleConnection oracleConn = conn.unwrap(oracle.jdbc.OracleConnection.class); 

异常消息:java.sql.SQLException: DSRA9122E: com.ibm.ws.rsadapter.jdbc.v41.WSJdbc41Connection@120edaf不换行 任何类型为 oracle.jdbc.OracleConnection 的对象。

我也在服务器中为我的应用程序添加了类加载器引用.xml但这没有帮助。

我的服务器.xml看起来像:

<dataSource  id="datasource" jndiName="jdbc/XXXXXX" 
type="javax.sql.XADataSource">
<jdbcDriver libraryRef="ordLib"/>
<properties.oracle databaseName="XXXX" driverType="thin" password="XXXXXX" 
portNumber="XXXXXX" serverName="XXXXXX" serviceName="XXXXXX" url="XXXXXX" 
user="XXXXXX"/>
</dataSource>
<webApplication id="NAExtractWeb" location="NAExtractWeb.war" 
name="NAExtractWeb">
<classloader commonLibraryRef="ordLib"></classloader>
</webApplication>
<library id="ordLib">
<fileset dir="C:lib" id="fileset" includes="ojdbc6-11.2.0.4.jar"/>
</library> 

此外,我在我的一个依赖项目 jar 中使用此解包函数,并且在我的依赖项目中添加了 ojdbc 依赖项(maven)。这会影响解包步骤吗?

以下是获取数据源的方法:

public DataSource getDataSource(String dsName) throws BatchException {
try {
return (DataSource) new InitialContext().lookup(dsName);
} catch (Exception e) {
//Code to handle
}
}

以下是完整的堆栈跟踪:

[6/19/18 17:20:29:340 IST] [进程分区0] com.ibm.ws.batch.JobLogger CWWKY0030I:运行步骤进程时发生异常。 com.ibm.jbatch.container.exception.BatchContainerRuntimeException: Failure in Read-Process-Write 循环 at com.ibm.jbatch.container.controller.impl.ChunkStepControllerImpl.invokeChunk(ChunkStepControllerImpl.java:704) at com.ibm.jbatch.container.controller.impl.ChunkStepControllerImpl.invokeCoreStep(ChunkStepControllerImpl.java:795) at com.ibm.jbatch.container.controller.impl.BaseStepControllerImpl.execute(BaseStepControllerImpl.java:293) at com.ibm.jbatch.container.controller.impl.ExecutionTransitioner.doExecutionLoop(ExecutionTransitioner.java:118) at com.ibm.jbatch.container.controller.impl.WorkUnitThreadControllerImpl.executeCoreTransitionLoop(WorkUnitThreadControllerImpl.java:93) at com.ibm.jbatch.container.controller.impl.WorkUnitThreadControllerImpl.executeWorkUnit(WorkUnitThreadControllerImpl.java:155) at com.ibm.jbatch.container.controller.impl.WorkUnitThreadControllerImpl$AbstractControllerHelper.runExecutionOnThread(WorkUnitThreadControllerImpl.java:480) at com.ibm.jbatch.container.controller.impl.WorkUnitThreadControllerImpl.runExecutionOnThread(WorkUnitThreadControllerImpl.java:89) at com.ibm.jbatch.container.util.BatchWorkUnit.run(BatchWorkUnit.java:117) at com.ibm.ws.context.service.serializable.ContextualRunnable.run(ContextualRunnable.java:79) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) 原因:com.ibm.jbatch.container.exception.BatchContainerRuntimeException: java.sql.SQLException: DSRA9122E: com.ibm.ws.rsadapter.jdbc.v41.WSJdbc41Connection@73c25e77 不包装任何类型为 oracle.jdbc.OracleConnection 的对象。 at com.ibm.jbatch.container.artifact.proxy.ItemWriterProxy.open(ItemWriterProxy.java:67) at com.ibm.jbatch.container.controller.impl.ChunkStepControllerImpl.openReaderAndWriter(ChunkStepControllerImpl.java:954) at com.ibm.jbatch.container.controller.impl.ChunkStepControllerImpl.invokeChunk(ChunkStepControllerImpl.java:599) ...还有 14 个 原因:java.sql.SQLException: DSRA9122E: com.ibm.ws.rsadapter.jdbc.v41.WSJdbc41Connection@73c25e77 不包装任何类型为 oracle.jdbc.OracleConnection 的对象。 at com.ibm.ws.rsadapter.jdbc.WSJdbcWrapper.unwrap(WSJdbcWrapper.java:459) at com.fmr.nfiws.batch.writer.DBWriter.open(DBWriter.java:149) at com.ibm.jbatch.container.artifact.proxy.ItemWriterProxy.open(ItemWriterProxy.java:64) ...还有 16 个

我刚刚在 WebSphere Liberty 上对此进行了测试,以下代码对我有用:

@Resource(lookup = "jdbc/oracle")
private DataSource ds;
// ...
Connection conn = ds.getConnection();
OracleConnection oracleConn = conn.unwrap(oracle.jdbc.OracleConnection.class);

我的服务器.xml如下所示:

<dataSource jndiName="jdbc/oracle">
<jdbcDriver libraryRef="oracleLib"/>
<properties.oracle URL="${jdbc.URL}" user="${jdbc.user}" password="${jdbc.password}"/>
</dataSource>
<library id="oracleLib">
<fileset dir="${server.config.dir}/oracle"/>
</library>
<application location="myApp.war" >
<classloader commonLibraryRef="oracleLib"/>
</application>

这里要注意的重要一点是在<classloader>元素上使用commonLibraryRef。 如果使用privateLibraryRef它将不起作用,因为应用程序和服务器定义的数据源将使用隔离的类装入器来装入 Oracle JDBC 类。

如果此答案对您没有帮助,请使用您的服务器.xml配置以及如何获取DataSource实例来更新您的问题。

如果有人有这个问题,这是我的解决方案。

我的错误是我正在将应用程序部署到dropins文件夹,如果您在server.xml中定义application/webApplication,则会忽略它。我将其部署到其他地方,将此新位置设置为应用程序标记,并在server.xml中添加了<classloader>,按照pom.xml中提供的方式保留了ojdbc jar,现在可以工作了。

但是当我在本地运行应用程序时,我仍然遇到问题,因为ojdbc jar是在pom.xml中提供的。
我的解决方案是使用反射来获取系统类加载器,并在运行时为本地配置文件加载 jar。

希望这对某人有所帮助。

我在本地机器中尝试了同样的事情,但由于自由运行时服务器路径中可用的相同 ojdbc jar 而不起作用。删除后其工作正常。 LibertyRuntime(在项目资源管理器中)->服务器(选择已部署的服务器)->apps->您可以看到 application-name.war.xml(请从 xml 中删除 ojdbc jar)。

确保 jar 在 xml 文件中不可用 最后启动服务器,它将工作。

最新更新