1

I am deploying a war that is working on my own machine and getting an error:

java.lang.AbstractMethodError: com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.setCharacterStream(ILjava/io/Reader;J)V

Full Stack Trace:

14:35:18.734 [scheduler-1] ERROR o.s.s.s.TaskUtils$LoggingErrorHandler - Unexpected error occurred in scheduled task.
java.lang.AbstractMethodError: com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.setCharacterStream(ILjava/io/Reader;J)V
        at org.hibernate.type.descriptor.sql.ClobTypeDescriptor$4$1.doBind(ClobTypeDescriptor.java:131) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
        at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:90) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
        at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:286) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
        at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:281) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
        at org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:56) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
        at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2857) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3121) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3581) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
        at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:104) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
        at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:463) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
        at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:349) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
        at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
        at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
        at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1222) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
        at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
        at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
        at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
        at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:77) ~[hibernate-entitymanager-4.3.6.Final.jar:4.3.6.Final]
        at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:515) ~[spring-orm-4.0.7.RELEASE.jar:4.0.7.RELEASE]
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:757) ~[spring-tx-4.0.7.RELEASE.jar:4.0.7.RELEASE]
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:726) ~[spring-tx-4.0.7.RELEASE.jar:4.0.7.RELEASE]
        at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:478) ~[spring-tx-4.0.7.RELEASE.jar:4.0.7.RELEASE]
        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:272) ~[spring-tx-4.0.7.RELEASE.jar:4.0.7.RELEASE]
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) ~[spring-tx-4.0.7.RELEASE.jar:4.0.7.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.0.7.RELEASE.jar:4.0.7.RELEASE]
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) ~[spring-aop-4.0.7.RELEASE.jar:4.0.7.RELEASE]
        at com.sun.proxy.$Proxy73.apply(Unknown Source) ~[na:na]
        at ec.europa.eu.egrants.emailmonitoring.services.chains.forms.ApplicationFormChain.apply(ApplicationFormChain.java:37) ~[email-monitoring-1.0-SNAPSHOT.jar:na]
        at ec.europa.eu.egrants.emailmonitoring.services.chains.forms.ApplicationFormChain.apply(ApplicationFormChain.java:19) ~[email-monitoring-1.0-SNAPSHOT.jar:na]
        at ec.europa.eu.egrants.emailmonitoring.ChainService.forEach(ChainService.java:50) ~[email-monitoring-1.0-SNAPSHOT.jar:na]
        at ec.europa.eu.egrants.emailmonitoring.ChainService.execute(ChainService.java:62) ~[email-monitoring-1.0-SNAPSHOT.jar:na]
        at ec.europa.eu.egrants.emailmonitoring.services.email.EmailLocalFolderMonitor.execute(EmailLocalFolderMonitor.java:81) ~[email-monitoring-1.0-SNAPSHOT.jar:na]
        at ec.europa.eu.egrants.emailmonitoring.services.email.EmailScheduler.pollEmails(EmailScheduler.java:27) ~[email-monitoring-1.0-SNAPSHOT.jar:na]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_71]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_71]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_71]
        at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_71]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65) ~[spring-context-4.0.7.RELEASE.jar:4.0.7.RELEASE]
        at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[spring-context-4.0.7.RELEASE.jar:4.0.7.RELEASE]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [na:1.7.0_71]
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304) [na:1.7.0_71]
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178) [na:1.7.0_71]
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.7.0_71]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_71]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_71]
        at java.lang.Thread.run(Thread.java:745) [na:1.7.0_71]

Update

1 ) Reading on the internet I a message post @ https://developer.jboss.org/thread/213711?tstart=0&_sscc=t :

use Hibernate with c3p0.

I had exactly the same problem after an attempt to upgrade from Hibernate 4.1.3 to 4.1.8.

Downgrading back to 4.1.3 solved the problem.

c3p0 version in both cases is the same: 0.9.1.

2) The answer at Abstract Method Error states that is could be "due to version incompatibility in some of the jar file."

3) Same error: Error when saving @Lob with hibernate java mysql

Update2

I was able to bypass the error ( fix? ) by changing the Resource driverClass in server.xml.

I had the following:

<Resource auth="Container"
      driverClass="oracle.jdbc.OracleDriver"
      maxPoolSize="20"
      minPoolSize="2"
      acquireIncrement="1"
      name="jdbc/g"
      user="egrants" 
      password="egrants"
      factory="org.apache.naming.factory.BeanFactory"
      type="com.mchange.v2.c3p0.ComboPooledDataSource"
      jdbcUrl="jdbc:oracle:thin:@//localhost:1521/XE"
      automaticTestTable="t_test_c3p0" idleConnectionTestPeriod="300"/>

Changing to the following stopped the error:

<Resource
        name="jdbc/g"
        auth="Container"
        type="javax.sql.DataSource"
        driverClassName="oracle.jdbc.OracleDriver"
        url="jdbc:oracle:thin:@127.0.0.1:1521:xe"
       factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
        username="root"
        password="root"
        maxActive="20"
        validationQuery="SELECT 1 FROM DUAL;"
        testOnBorrow="true"
        maxIdle="10"
        maxWait="-1"/>

I have a feeling though there must be a downsite to this switch since the previous developer had written the previous definition.

How would I go about using the original c3p0 definition but avoiding the error?

Next things to try:

  1. Change a jar file on the tomcat server?
  2. Modifying my pom.xml .
Community
  • 1
  • 1
Menelaos
  • 23,508
  • 18
  • 90
  • 155

1 Answers1

1

Summary

Two workarounds/fixes I found:

  1. Updating the JAR files within the tomcat/lib folder
  2. Switching to a different driver in my server.xml resource definition.

Updating Jar files

Adding a definition in my pom.xml didn't work strangely as they didn't seem to be generated in the war. I resorted to updating the jars in the tomcat/lib folder.

cd apache-tomcat-6_0_36-ep-01/lib
ls
mv c3p0-0.9.2-pre4.jar c3p0-0.9.2-pre4.jar.OLD
wget http://central.maven.org/maven2/com/mchange/c3p0/0.9.5/c3p0-0.9.5.jar

mv mchange-commons-java-0.2.2.jar mchange-commons-java-0.2.2.jar.OLD
wget http://central.maven.org/maven2/com/mchange/mchange-commons-java/0.2.9/mchange-commons-java-0.2.9.jar

Switching to Different Driver

I was able to bypass the error ( fix? ) by changing the Resource driverClass in server.xml.

I had the following:

<Resource auth="Container"
      driverClass="oracle.jdbc.OracleDriver"
      maxPoolSize="20"
      minPoolSize="2"
      acquireIncrement="1"
      name="jdbc/g"
      user="root" 
      password="root"
      factory="org.apache.naming.factory.BeanFactory"
      type="com.mchange.v2.c3p0.ComboPooledDataSource"
      jdbcUrl="jdbc:oracle:thin:@//localhost:1521/XE"
      automaticTestTable="t_test_c3p0" idleConnectionTestPeriod="300"/>

Changing to the following stopped the error:

<Resource
        name="jdbc/g"
        auth="Container"
        type="javax.sql.DataSource"
        driverClassName="oracle.jdbc.OracleDriver"
        url="jdbc:oracle:thin:@127.0.0.1:1521:xe"
       factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
        username="root"
        password="root"
        maxActive="20"
        validationQuery="SELECT 1 FROM DUAL;"
        testOnBorrow="true"
        maxIdle="10"
        maxWait="-1"/>

I have a feeling though there must be a downsite to this switch since the previous developer had written the previous definition.

Menelaos
  • 23,508
  • 18
  • 90
  • 155