【转】讨厌的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报错

Java代码  收藏代码
  1. Caused by: org.springframework.dao.InvalidDataAccessApiUsageException:  
  2. Couldn'tinitializeOracleLobHandler because Oracle driver classes are not available.  
  3. Note that OracleLobHandler requires Oracle JDBC driver 9i or higher!;  
  4.  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来解决,他把

Java代码  收藏代码
  1. con.getClass().getClassLoader()  


hack成了

Java代码  收藏代码
  1. Thread.currentThread().getContextClassLoader()  


于是我也照此办理,hack完重启,发现报错变为

Java代码  收藏代码
  1. org.springframework.dao.InvalidDataAccessApiUsageException: OracleLobCreator needs to work on   
  2. [oracle.jdbc.OracleConnection], not on [com.ibm.ws.rsadapter.jdbc.WSJdbcConnection]: specify a   
  3. corresponding NativeJdbcExtractor; nested exception is java.lang.ClassCastException:   
  4. com.ibm.ws.rsadapter.jdbc.WSJdbcConnection incompatible with oracle.jdbc.OracleConnection  
  5. java.lang.ClassCastException: com.ibm.ws.rsadapter.jdbc.WSJdbcConnection incompatible with   
  6. oracle.jdbc.OracleConnection  


这下就很明白了,传进来的连接是WAS类型的,spring不认。
再次google这个错误,得到解决方法
将spring配置中

Java代码  收藏代码
  1. <bean id="nativeJdbcExtractor"   
  2. class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor" />  


改为

Java代码  收藏代码
  1. <bean id="nativeJdbcExtractor"   
  2. class="org.springframework.jdbc.support.nativejdbc.WebSphereNativeJdbcExtractor" />  



于是照此办理,重启WAS,问题解决。
再将hack之前的spring原始包替换回去,重启WAS,测试没有问题。只要把配置改回SimpleNativeJdbcExtractor就会
报最开始的那个错误。

最后还是想抱怨下spring,报的错实在是太有迷惑性了,JdbcExtractor用错了居然会报ClassNotFoundException: oracle.sql.BLOB
I服了U

posted @ 2013-03-08 13:09  青松高洁  阅读(943)  评论(0)    收藏  举报