业务有个需求需要读写clob字段,于是使用spring的oracleLobHandler来解决,在本机tomcat下测试没有问题
生产环境是WAS 6.1,部署上去发现读LOB没问题,写LOB报错
Caused by: org.springframework.dao.InvalidDataAccessApiUsageException:
Couldn'tinitializeOracleLobHandler because Oracle driver classes are not available.
Note that OracleLobHandler requires Oracle JDBC driver 9i or higher!;
nested exception is java.lang.ClassNotFoundException: oracle.sql.BLOB
看这个错似乎是oracle driver不对,但是登陆系统进行其他操作都是没问题的,说明oracle driver的加载没有问题
使用的版本也是ojdbc_14g.jar,也没有问题。
google了一下发现有人认为是oracle包冲突的原因,于是仔细检查了WAS环境,删除多余的oracle包,仍然报这个错
读了一下spring OracleLobHandler的代码,怎么看都象是classLoader的问题,
于是再次google,发现有位老兄是通过hack spring的OracleLobHandler来解决,他把
con.getClass().getClassLoader()
hack成了
Thread.currentThread().getContextClassLoader()
于是我也照此办理,hack完重启,发现报错变为
org.springframework.dao.InvalidDataAccessApiUsageException: OracleLobCreator needs to work on
[oracle.jdbc.OracleConnection], not on [com.ibm.ws.rsadapter.jdbc.WSJdbcConnection]: specify a
corresponding NativeJdbcExtractor; nested exception is java.lang.ClassCastException:
com.ibm.ws.rsadapter.jdbc.WSJdbcConnection incompatible with oracle.jdbc.OracleConnection
java.lang.ClassCastException: com.ibm.ws.rsadapter.jdbc.WSJdbcConnection incompatible with
oracle.jdbc.OracleConnection
这下就很明白了,传进来的连接是WAS类型的,spring不认。
再次google这个错误,得到解决方法
将spring配置中
<bean id="nativeJdbcExtractor"
class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor" />
改为
<bean id="nativeJdbcExtractor"
class="org.springframework.jdbc.support.nativejdbc.WebSphereNativeJdbcExtractor" />
于是照此办理,重启WAS,问题解决。
再将hack之前的spring原始包替换回去,重启WAS,测试没有问题。只要把配置改回SimpleNativeJdbcExtractor就会
报最开始的那个错误。
最后还是想抱怨下spring,报的错实在是太有迷惑性了,JdbcExtractor用错了居然会报ClassNotFoundException: oracle.sql.BLOB
I服了U
PS:我在javaeye上找答案的时候发现也有个兄弟提了这个问题,但是没人回答,问题都结贴了,这里算是给他回答了。