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

时间:2018-06-19 11:28:28

标签: java oracle jdbc websphere ojdbc

我正在使用Websphere自由服务器运行我的应用程序,并且需要使用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的对象。

我也在server.xml中为我的应用程序添加了类加载器参考,但这没有帮助。

我的server.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:读取过程写入循环失败     在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个

3 个答案:

答案 0 :(得分:0)

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

@Resource(lookup = "jdbc/oracle")
private DataSource ds;

// ...

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

我的server.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>

此处要注意的重要事项是在commonLibraryRef元素上使用<classloader>。如果您使用privateLibraryRef,它将无法正常工作,因为应用程序和服务器定义的数据源将使用隔离的类加载器来加载Oracle JDBC类。

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

答案 1 :(得分:0)

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

我的错误是我将应用程序部署到dropins文件夹中,如果您在application/webApplication中定义了server.xml,则会被忽略。我将其部署在其他地方,将这个新位置设置为应用程序标签,并在<classloader>中添加了server.xml,并按照ojdbc jar的说明离开了pom.xml,现在可以使用了。

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

希望这对某人有帮助。

答案 2 :(得分:0)

我在本地计算机上尝试了相同的操作,但由于在自由运行时服务器路径中可用的ojdbc jar相同,因此无法正常工作。删除其工作正常之后。 LibertyRuntime(在项目浏览器中)-> 服务器(选择已部署的服务器)-> apps->您会看到application-name.war.xml(请从xml中删除ojdbc jar)。

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