ITPub博客

首页 > 应用开发 > Java > DBcp 替换 c3p0 引起的问题

DBcp 替换 c3p0 引起的问题

原创 Java 作者:xz43 时间:2014-04-11 09:49:39 0 删除 编辑
正常情况下,应用替换连接池很简单,仅仅需要在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博客 ” ,链接:https://blog.itpub.net/9399028/viewspace-1139925/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
鱼儿的学习空间

注册时间:2010-11-16

  • 博文量
    433
  • 访问量
    1863772