WSJDBCConnection不包装Oracle jdbc Connection类型的对象 [英] WSJDBCConnection does not wrap objects of type Oracle jdbc Connection

查看:162
本文介绍了WSJDBCConnection不包装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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆