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里面)
    
    评论

报告相同问题?

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥15 绘制多分类任务的roc曲线时只画出了一类的roc,其它的auc显示为nan
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?