今天测试的时候发现。
执行语句((com.informix.jdbc.IfmxStatement) stmtInsert).getSerial()[stmtInsert:java.sql.Statement]时报错"java.lang.ClassCastException"
由于数据连接使用的是tomcat连接池,也就固执的认为是由于类加载器不同产生的问题,到apache把tomcat的配置文件server.xml中与类加载相关的部分看了一下,并把放到了Context里,可是问题依然。我想到应该在weblogic里试一下,使用时发现并没有这样的问题存在,一下子陷入了僵局,不知再从何入手了。
随便在网上搜了一下,找到下面一段:
(oracle.jdbc.driver.OracleResultSet)dbRst.getBLOB(1)时发生错误.
因为在jdbc连接时,此处的ResultSet为java.sql.ResultSet,是oracle.jdbc.driver.OracleResultSet的超类,所以转换不会出错.
而当我们使用dbcp时,此处返回的ResultSet为org.apache.commmons.dbcp.DelegatingResultSet类型.所以转换会出错.
我突然意识到我的错误与此如出一辙,立刻豁然开朗。
Tomcat连接池返回的Statement,Result等等都是common-dbcp里java.sql.*的子类,而不是com.informix.jdbc.*内的类,返回的Statement实际是org.apache.commmons.dbcp.DelegatingStatement,它继承了java.sql.Statement接口,com.informix.jdbc.IfmxStatement则治不了它了,所以产生了"java.lang.ClassCastException"错误。
问题找到了,解决办法却是不得不放弃使用这种方法,只能用执行sql(“select dbinfo('sqlca.sqlerrd1') from tablename”)代替。
最后要说一下,weblogic的连接池不会有这样的问题,应该是由于连接池返回的就是jdbc驱动内的类的实例。
阅读(2305) | 评论(0) | 转发(0) |