DBcp 替换 c3p0 引起的问题

正常情况下,应用替换连接池很简单,仅仅需要在Spring的配置文件中,把 dataSource 的类文件,由 class="com.mchange.v2.c3p0.ComboPooledDataSource" 改为 class="org.apache.commons.dbcp.BasicDataSource",相关的配置参数调整一下即可。
如果应用中牵涉到Clob字段的处理,则需要注意了。
首先,Spring 配置文件中,
  class="org.springframework.jdbc.support.nativejdbc.C3P0NativeJdbcExtractor"
  lazy-init="true" />
上面的class 同样需要修改为 class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"
  class="org.springframework.jdbc.support.lob.OracleLobHandler"
  lazy-init="true">
  
   
  
 
然后
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  
   
  
  
...

然后相关JavaBean 的hibernate配置文件 bean.hbm.xml 中

    
  
JavaBean中的属性定义及get、set方法
private String keyword;
...

 public String getKeyword() {
  return keyword;
 }

 public void setKeyword(String keyword) {
  this.keyword = keyword;
 }

一切按上面的配置好,本以为就OK,实际情况还是报错:
org.springframework.dao.InvalidDataAccessApiUsageException: OracleLobCreator needs to work on [oracle.jdbc.OracleConnection], not on [org.apache.commons.dbcp.PoolableConnection]: specify a corresponding NativeJdbcExtractor; nested exception is java.lang.ClassCastException: org.apache.commons.dbcp.PoolableConnection cannot be cast to oracle.jdbc.OracleConnection
java.lang.ClassCastException: org.apache.commons.dbcp.PoolableConnection cannot be cast to oracle.jdbc.OracleConnection
        at oracle.sql.CLOB.createTemporary(CLOB.java:754)
        at oracle.sql.CLOB.createTemporary(CLOB.java:716)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at org.springframework.jdbc.support.lob.OracleLobHandler$OracleLobCreator.prepareLob(OracleLobHandler.java:385)
        at org.springframework.jdbc.support.lob.OracleLobHandler$OracleLobCreator.createLob(OracleLobHandler.java:334)
        at org.springframework.jdbc.support.lob.OracleLobHandler$OracleLobCreator.setClobAsString(OracleLobHandler.java:260)
        at org.springframework.orm.hibernate3.support.ClobStringType.nullSafeSetInternal(ClobStringType.java:82)
        at org.springframework.orm.hibernate3.support.AbstractLobType.nullSafeSet(AbstractLobType.java:190)
        at org.hibernate.type.CustomType.nullSafeSet(CustomType.java:145)
        at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:1826)
        at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2172)
        at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2118)
        at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2374)
        at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:84)
        at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:243)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:227)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1009)
        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:356)
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
        at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:584)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:496)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:469)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.doCommitTransactionAfterReturning(TransactionAspectSupport.java:266)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:176)

百思不得其解,折腾了好久,换了几个版本的dbcp jar包,最好换到 commons-dbcp-1.2.1.jar 时,成功运行。看来,dbcp和其他相关jar的版本是否一致,也是很重要的。如果不一致,即使像上面那样的配置好了,还是不能执行成功。
问题解决了,通过这个问题可以提醒我的却还有很多,记录下来以备将来启发思路。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9399028/viewspace-1139925/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9399028/viewspace-1139925/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值