【转】讨厌的spring Blob Clob问题
org.springframework.dao.InvalidDataAccessApiUsageException: Couldn't initialize OracleLobHandler 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
得换nativeJdbcExtractor
tamcat的是org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor
websphere的是org.springframework.jdbc.support.nativejdbc.WebSphereNativeJdbcExtractor
http://www.iteye.com/topic/351365
业务有个需求需要读写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

浙公网安备 33010602011771号