2015-03-01 5 views
1

Привет Я использую Hibernate core 4.3.1 FINAL, hibernate-c3p0 4.3.1 FINAL. Использование конфигурации сохранения JPA, которая приведена ниже.C3P0 Выбрасывает исключение в случае @transactional

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
version="2.0"> 

<persistence-unit name="somename"> 
    <description> 

    </description> 

    <properties> 
     <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> 
     <property name="javax.persistence.jdbc.url" 
      value="jdbc:mysql://localhost:3306/somename?autoReconnect=true" /> 
     <property name="javax.persistence.jdbc.user" value="root" /> 
     <property name="javax.persistence.jdbc.password" value="admin" /> 

     <property name="hibernate.show_sql" value="true" /> 
     <property name="hibernate.hbm2ddl.auto" value="none" /> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" /> 
     <property name="hibernate.connection.provider_class" value="org.hibernate.c3p0.internal.C3P0ConnectionProvider" /> 

     <property name="hibernate.c3p0.max_size" value="100" /> 
     <property name="hibernate.c3p0.min_size" value="1" /> 
     <property name="hibernate.c3p0.acquire_increment" value="1" /> 
     <property name="hibernate.c3p0.idle_test_period" value="50" /> 
     <property name="hibernate.c3p0.max_statements" value="0" /> 
     <property name="hibernate.c3p0.timeout" value="100" /> 
    </properties> 

</persistence-unit> 

Я использую JpaTransactionManager к весне, как это.

В моем классе обслуживания я использовал.

@Transactional 
public void deleteSomething(){...} 

Таким образом, всякий раз, когда этот метод, или любой метод с транзакцией выполняется, я получаю следующее исключение:

2015-03-01 02:34:16 [DEBUG] - delete from badoc where baId=? and docId=? 
Hibernate: delete from badoc where baId=? and docId=? 
2015-03-01 02:34:16 [DEBUG] - com.mchange.v2.c3p0.imp[email protected]4b969e3c.acquireResource() returning. 
2015-03-01 02:34:16 [DEBUG] - trace [email protected] [managed: 2, unused: 1, excluded: 0] (e.g. [email protected]) 
2015-03-01 02:34:16 [DEBUG] - decremented pending_acquires: 0 
2015-03-01 02:34:16 [DEBUG] - Acquisition series terminated successfully. Decremented pending_acquires [0], attempts_remaining: 30 
2015-03-01 02:34:16 [DEBUG] - Converting Throwable to SQLException... 
java.lang.NullPointerException 
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.maybeDirtyTransaction(NewProxyPreparedStatement.java:2520) 
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.getMaxRows(NewProxyPreparedStatement.java:1403) 
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.close(JdbcCoordinatorImpl.java:530) 
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.release(JdbcCoordinatorImpl.java:407) 
    at org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl.releaseStatements(AbstractBatchImpl.java:173) 
    at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:76) 
    at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3400) 
    at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3624) 
    at org.hibernate.action.internal.EntityDeleteAction.execute(EntityDeleteAction.java:113) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:453) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:345) 
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350) 
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56) 
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1218) 
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:421) 
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101) 
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177) 
    at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:77) 
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:515) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:757) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:726) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:478) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:272) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644) 
    at com.pwc.atlas.service.DocumentService$$EnhancerBySpringCGLIB$$b0e32825.manageBADocument(<generated>) 
    at com.pwc.atlas.rest.SolrController.manageBaDocuments(SolrController.java:463) 
    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:606) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:690) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:744) 
2015-03-01 02:34:16 [DEBUG] - Exception clearing maxRows/queryTimeout [You can't operate on a closed Statement!!!] 
2015-03-01 02:34:16 [DEBUG] - committed JDBC Connection 
2015-03-01 02:34:16 [DEBUG] - Closing JPA EntityManager [[email protected]] after transaction 
2015-03-01 02:34:16 [DEBUG] - Closing JPA EntityManager 
2015-03-01 02:34:16 [DEBUG] - HHH000420: Closing un-released batch 
2015-03-01 02:34:16 [DEBUG] - Releasing JDBC connection 

Сделка завершает, но с этим исключением.

Я довольно новичок в использовании JPA с hibernate с пулом соединений. Не могли бы вы помочь, если мне что-то не хватает в конфигурации?

ответ

2

Обратите внимание, что Исключение, которое вы зарегистрировали, отображается только на уровне DEBUG. c3p0 записывает вещи на уровне DEBUG.

В этом случае вы зарегистрировали исключение rootCause, пока оно обернуто SQLException, которое затем обрабатывает Hibernate. Показанный rootCause указывает, что Statement уже закрыт() ed. Обработка обернутой Exception регистрируется с более информативным сообщением:

Exception clearing maxRows/queryTimeout [You can't operate on a closed Statement!!!] 

Hibernate пытается сделать какое-то очистки на заявлениях и найти, что заявление уже близко() ред. Если вы Google в разделе «Исключение освобождения maxRows/queryTimeout», вы найдете довольно много на эту проблему. Возможные причины включают в себя приложение, держась несвежих соединения и подключения получать таймаут на сервере (см обсуждение here. Это против HikariCP. Вы найдете аналогичный reports against DBCP а.)

ли убедитесь, что нет ничего в вашем приложении который удерживается на соединениях или сеансах, которые закрыты.

Вы можете использовать a more reliable Connection testing scheme. В частности, я бы начал с установки hibernate.c3p0.preferredTestQuery на SELECT 1 и hibernate.c3p0.testConnectionOnCheckout на true (и установил hibernate.c3p0.idle_test_period на 0, исключая тесты пока на холостом ходу).

Вы также можете рассмотреть возможность обновления до c3p0-0.9.5, который предлагает множество исправлений и улучшений. (Вы должны переопределить транзитивную зависимость по умолчанию в hibernate-c3p0 4.3.1.) Но это, вероятно, не решит эту проблему.

+0

О, несвязанный, но, пожалуйста, не используйте 'приобретатьIncrement' 1. Почему бы не придерживаться значения c3p0 по умолчанию 3 или даже выше? Если вы можете позволить себе, чтобы ваш пул вырос до 100 подключений, вы можете позволить себе его рост по 3 за раз, а производительность, воспринимаемая клиентом в периоды роста пула, улучшится. –

+0

Спасибо @Steve. Я обновился до hibernate-c3p0. 4.3.7. Окончательная версия. который работал. Сейчас я не вижу этого исключения. И спасибо за предложение увеличить количество аквариума до 3. Я сделаю это. –