luobobaobao2012 2013-07-03 06:45 采纳率: 0%
浏览 4976

Java调用Oracle存储过程传入数组参数报错

weblogic连接池 JNDI提供的链接保存 Oracle数组 报错 oracle.jdbc.driver.T4CConnection cannot be cast to oracle.jdbc.OracleConnection

oracle.jdbc.driver.T4CConnection cannot be cast to oracle.jdbc.OracleConnection

大家好,我在用weblogic连接池 JNDI 提供的,连接保存,oracle自定数组 报错,麻烦问问,怎么搞咯?谢谢哈

ArrayList array;
ARRAY adArray = getExpInfoArray(con,"EXP_INFO_TYPE_ARR", array);

参数解释:

(1)
EXP_INFO_TYPE_ARR 是Oracle数据库中定义的数组类型的名称

(2)
array是java类型的对象集合对象,就可以在调用存储过程时作为数组参数传入。

需注意的是,connection必须是Native Connection,如果connection是通过JDBC建立数据库连接并获取的,就不会有问题,

但是如果是通过JNDI数据源获取的,就不行,因为从数据源获取的Connection是Native Connection的代理类,

比如Tomcat中通过配置的JNDI数据源获取连接,连接类型是org.apache.commons.dbcp.PoolableConnection类型的;

在WebLogic、JBoss等其他服务器中,得到的Connection类型又是不同的

报错信息如下:
oracle.jdbc.driver.T4CConnection cannot be cast to oracle.jdbc.OracleConnection

上网搜索的到2个解决办法如下:

(1)删除WEB-INF/lib目录下的Oracle数据库驱动

http://raise.diandian.com/java/the-method-for-passing-arrays-para-to-oracle.html

方法(1)给出的解决方式:部署环境下,删除WEB-INF/lib目录下的Oracle数据库驱动!---
按照这样删除的话,上面的代码岂不是编译报错?

(2)从数据源获取物理连接

http://middleware123.com/weblogic/docs100/jdbc/thirdparty.html

Connection conn = null; try { ctx = new InitialContext(ht);

// 在 JNDI 树上查找数据源并请求 // 连接。

javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup ("myDataSource");

// 总是在 try 块中获取缓冲池连接, // 在这里,完全使用缓冲池连接,

// 并且必要时,在 finally 块中关闭缓冲池连接。 conn = ds.getConnection();

// 现在可以将 conn 对象转换为 WLConnection // 接口,然后获取底层物理连接。

java.sql.Connection vendorConn = ((WLConnection)conn).getVendorConnection();

// 不关闭 vendorConn // 也可以将 vendorConn 对象转换为供应商

// 接口,例如: // oracle.jdbc.OracleConnection vendorConn = (OracleConnection)

// ((WLConnection)conn).getVendorConnection()

试过了以上方法,还是不行,还是报错:
oracle.jdbc.driver.T4CConnection cannot be cast to oracle.jdbc.OracleConnection

---真诚感谢,有心回复教导的人,虽然我没钱钱,,工资也很底...

  • 写回答

1条回答

  • 千年聊一会 2015-10-05 12:10
    关注

    我也遇到了这个问题,最终解决方案
    1、删除web-info/lib下的ojdbc包
    2、web-info下面weblogic.xml里面,添加 true
    3、 spring配置文件,添加nativeJdbcExtractor注入
    class="org.springframework.jdbc.support.nativejdbc.WebLogicNativeJdbcExtractor"
    lazy-init="true" />

    <!-- <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
        <property name="jndiName" value="java:comp/env/jdbc/OracleDataSource" /> 
        </bean> -->
    <jee:jndi-lookup id="dataSource" jndi-name="DataSource_decode"
        resource-ref="true" />
    
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource" />
        <property name="nativeJdbcExtractor" ref="nativeJdbcExtractor" />
    </bean>
    
    思路:获取weblogic本地的原始conn来替换jdbc的conn
    另外因为web-info下面的包先加载,ojdbc4与weblogic下面的jdbc冲突,故删除web-info/lib下面的jdbc包
    编译的时候把ojdbc14.jar添加到classpath即可,不影响编译,(只要不放到web-info/lib下面的包,都不会部署到Weblogic里面)
    
    评论

报告相同问题?

悬赏问题

  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler