【发布时间】:2018-06-19 11:28:28
【问题描述】:
我正在使用 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 类型的任何对象。
我也在 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] [process partition0] com.ibm.ws.batch.JobLogger CWWKY0030I:运行 step 流程时发生异常。 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 更多
【问题讨论】:
-
“我的依赖项目中添加了 ojdbc 依赖项(maven)” 这可能意味着类路径上有 两个
oracle.jdbc.OracleConnection类:一个由 Websphere 本身为池创建的连接加载,另一个由您的应用程序加载。如果您的应用程序引用oracle.jdbc.OracleConnection.class,这可能会导致一个不同的 类,从而导致解包失败(因为它们不是由同一个类加载器加载的)。如果您从项目中明确排除 Oracle 依赖项,您可能想检查会发生什么。 -
ojdbc 依赖 jar 范围设置为“提供”以不在构建中添加它,仅用于编译。添加后,代码在展开行将 NoClassDefErro r 抛出给我..
-
你能发布完整的堆栈跟踪吗?也许这会给我们更多的想法。
-
您是否以某种方式将 Oracle 驱动程序打包在您的应用程序中或您的类路径中(除了您已经提供的配置)?
-
"adara muthu" 是唯一的解决方案。
标签: java oracle jdbc websphere ojdbc