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、删除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里面)