首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WSJDBCConnection不包装类型为Oracle连接的对象。

WSJDBCConnection不包装类型为Oracle连接的对象。
EN

Stack Overflow用户
提问于 2018-06-19 11:28:28
回答 3查看 1.9K关注 0票数 2

我正在使用Websphere for服务器来运行我的应用程序,我需要使用ArrayDescriptor将数组传递给oracle存储过程。在打开连接时,我会得到一个异常。我也检查了连接元数据驱动程序的信息,并向我展示了oracle.jdbc驱动程序。代码在连接展开行处失败。

代码语言:javascript
复制
Connection conn = this.getDataSource().getConnection();
OracleConnection oracleConn = conn.unwrap(oracle.jdbc.OracleConnection.class); 

异常消息: java.sql.SQLException: DSRA9122E: DSRA9122E: oracle.jdbc.OracleConnection不包装任何类型的对象。

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

我的server.xml看起来像:

代码语言:javascript
复制
<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)。这会影响展开步骤吗?

下面是获取数据源的方法:

代码语言:javascript
复制
 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 com.ibm.ws.batch.JobLogger CWWKY0030I:运行步骤进程时出现异常。com.ibm.jbatch.container.exception.BatchContainerRuntimeException:在读-进程-写循环中失败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)在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)在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)由: 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) 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种原因是: 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) at com.fmr.nfiws.batch.writer.DBWriter.open(DBWriter.java:149) at com.ibm.jbatch.container.artifact.proxy.ItemWriterProxy.open(ItemWriterProxy.java:64) . 16

EN

回答 3

Stack Overflow用户

发布于 2018-06-19 13:24:19

我刚刚在WebSphere for上测试了这个程序,下面的代码对我有用:

代码语言:javascript
复制
@Resource(lookup = "jdbc/oracle")
private DataSource ds;

// ...

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

我的server.xml看起来是这样的:

代码语言:javascript
复制
<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类。

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

票数 3
EN

Stack Overflow用户

发布于 2018-09-19 14:26:26

如果有人有这个问题,这是我的解决办法。

我的错误是,我将应用程序部署到dropins文件夹,如果您在server.xml中定义了一个application/webApplication,则会忽略它。我将它部署到其他地方,将这个新位置设置为应用程序标记,并在server.xml中添加了server.xml中的ojdbc jar,保留了pom.xml中提供的ojdbc jar,现在它开始工作了。

但是,当我在本地运行应用程序时仍然遇到了问题,因为ojdbc jar是在pom.xml中提供的。

我的解决方案是使用反射获取系统类加载器,并在运行时为本地配置文件加载jar。

希望这能帮上忙。

票数 0
EN

Stack Overflow用户

发布于 2020-04-05 08:36:54

我在本地机器上尝试了相同的操作,但由于在自由运行时服务器路径中可以使用相同的ojdbc,所以无法工作。在移除它的工作后很好。LibertyRuntime(在项目资源管理器中)->服务器(选择已部署的服务器)->应用程序->您可以看到application-name.war.xml(请从xml中删除ojdbc )。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50927325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档