WSJDBCConnection不包装Oracle jdbc Connection类型的对象 [英] WSJDBCConnection does not wrap objects of type Oracle jdbc Connection
问题描述
我正在使用Websphere自由服务器运行我的应用程序,并且我需要使用ArrayDescriptor
将数组传递给oracle存储过程.展开连接时出现异常.我也检查了连接元数据驱动程序信息,它向我显示了oracle.jdbc驱动程序.代码在连接展开行失败.
I am using Websphere liberty server to run my application and I need to use ArrayDescriptor
for passing arrays to the oracle stored procedure. I get an exception while unwrapping the connection. I have checked the connection meta data driver information as well and it is showing me oracle.jdbc driver. The code fails at connection unwrapping line.
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的对象.
Exception message: java.sql.SQLException: DSRA9122E: com.ibm.ws.rsadapter.jdbc.v41.WSJdbc41Connection@120edaf does not wrap any objects of type oracle.jdbc.OracleConnection.
我也在server.xml中为我的应用程序添加了类加载器参考,但这无济于事.
I have added class loader reference for my application in the server.xml as well but that didn't help.
我的server.xml看起来像:
My server.xml looks like :
<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).这会影响展开步骤吗?
Also I use this unwrap function in one of my dependent project jar and I have ojdbc dependency(maven) added in my dependent project. Will that affect the unwrapping step?
这里是获取数据源的方法:
Here is the method which will get the data source:
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:读取过程写入循环失败 在com.ibm.jbatch.container.controller.impl.ChunkStepControllerImpl.invokeChunk(ChunkStepControllerImpl.java:704) 在com.ibm.jbatch.container.controller.impl.ChunkStepControllerImpl.invokeCoreStep(ChunkStepControllerImpl.java:795) 在com.ibm.jbatch.container.controller.impl.BaseStepControllerImpl.execute(BaseStepControllerImpl.java:293) 在com.ibm.jbatch.container.controller.impl.ExecutionTransitioner.doExecutionLoop(ExecutionTransitioner.java:118) 在com.ibm.jbatch.container.controller.impl.WorkUnitThreadControllerImpl.executeCoreTransitionLoop(WorkUnitThreadControllerImpl.java:93)上 在com.ibm.jbatch.container.controller.impl.WorkUnitThreadControllerImpl.executeWorkUnit(WorkUnitThreadControllerImpl.java:155)处 在com.ibm.jbatch.container.controller.impl.WorkUnitThreadControllerImpl $ AbstractControllerHelper.runExecutionOnThread(WorkUnitThreadControllerImpl.java:480)处 在com.ibm.jbatch.container.controller.impl.WorkUnitThreadControllerImpl.runExecutionOnThread(WorkUnitThreadControllerImpl.java:89) 在com.ibm.jbatch.container.util.BatchWorkUnit.run(BatchWorkUnit.java:117) 在com.ibm.ws.context.service.serializable.ContextualRunnable.run(ContextualRunnable.java:79) 在java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:511) 在java.util.concurrent.FutureTask.run(FutureTask.java:266) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617) 在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的对象. 在com.ibm.jbatch.container.artifact.proxy.ItemWriterProxy.open(ItemWriterProxy.java:67) 在com.ibm.jbatch.container.controller.impl.ChunkStepControllerImpl.openReaderAndWriter(ChunkStepControllerImpl.java:954) 在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的对象. 在com.ibm.ws.rsadapter.jdbc.WSJdbcWrapper.unwrap(WSJdbcWrapper.java:459) 在com.fmr.nfiws.batch.writer.DBWriter.open(DBWriter.java:149) 在com.ibm.jbatch.container.artifact.proxy.ItemWriterProxy.open(ItemWriterProxy.java:64) ...还有16个
[6/19/18 17:20:29:340 IST] [process partition0] com.ibm.ws.batch.JobLogger CWWKY0030I: An exception occurred while running the step process. com.ibm.jbatch.container.exception.BatchContainerRuntimeException: Failure in Read-Process-Write Loop 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) Caused by: com.ibm.jbatch.container.exception.BatchContainerRuntimeException: java.sql.SQLException: DSRA9122E: com.ibm.ws.rsadapter.jdbc.v41.WSJdbc41Connection@73c25e77 does not wrap any objects of type 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 more Caused by: java.sql.SQLException: DSRA9122E: com.ibm.ws.rsadapter.jdbc.v41.WSJdbc41Connection@73c25e77 does not wrap any objects of type 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 more
推荐答案
我刚刚在WebSphere Liberty上对此进行了测试,以下代码对我有用:
I just tested this on WebSphere Liberty and the following code worked for me:
@Resource(lookup = "jdbc/oracle")
private DataSource ds;
// ...
Connection conn = ds.getConnection();
OracleConnection oracleConn = conn.unwrap(oracle.jdbc.OracleConnection.class);
我的server.xml看起来像这样:
My server.xml looks like this:
<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类.
The important thing to note here is the use of commonLibraryRef
on the <classloader>
element. If you use privateLibraryRef
it will not work because the app and server-defined datasource will use isolated classloaders to load the Oracle JDBC classes.
如果该回答对您没有帮助,请使用server.xml配置以及您如何获取DataSource
实例的方式来更新您的问题.
If this answer isn't helpful to you, please update your question with your server.xml configuration, and also how you are obtaining an instance of your DataSource
.
这篇关于WSJDBCConnection不包装Oracle jdbc Connection类型的对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!