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

标签 java oracle jdbc websphere ojdbc

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

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

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 中为我的应用程序添加了类加载器引用,但这没有帮助。

我的 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 dependency(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 更多 Caused by: 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 个

最佳答案

我刚刚在 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 的实例。 .

关于java - WSJDBCConnection 不包装 Oracle jdbc Connection 类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57530131/

相关文章:

java - 如何找到喜欢我的页面的用户喜欢的其他页面? [Facebook]

java - 泛型类型函数的返回语句错误

database - Oracle可选关系

sql - 在 SYS_REFCURSOR 中执行动态 sql 语句

sql - 索引列上的不同值

postgresql - clojure.java.jdbc : How to read postgres dates as localdate when in a non-utc timezone?

Java JDBC rowset 到 tocollection() 方法的使用

java - JSP类解释

java - 可编辑的 JComboBox

预准备语句中的 MYSQL 异常在 '?' 附近使用正确的语法