2010-06-26 4 views
1

J'ai eu des problèmes avec Hibernate et Mysql erreur de délai d'attente pendant une semaine. Apparemment, après que mon Hibernate/MySQL ait été lancé après 8 heures (ce qui est la valeur de délai d'attente par défaut dans Mysql), j'ai l'exception. J'ai également ajouté c3p0. Mais ça n'aide pas.Hibernate et problème de délai d'attente Mysql, ne fonctionne pas avec c3p0

S'il vous plaît conseiller Merci beaucoup

Voici ma configuration Hibernate:

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
<!--Account MYSQL Username Info--> 
<property name="hibernate.connection.url">jdbc:mysql://localhost/reddragon_test?autoReconnect=true</property> 
<property name="hibernate.show_sql">true</property> 
<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property> 
<property name="current_session_context_class">thread</property> 

<property name="hibernate.c3p0.acquire_increment">3</property> 
<property name="hibernate.c3p0.idle_test_period">10</property> 
<property name="hibernate.c3p0.timeout">10</property> 
<property name="hibernate.c3p0.max_size">15</property> 
<property name="hibernate.c3p0.min_size">3</property> 
<property name="hibernate.c3p0.max_statements">0</property> 
<property name="hibernate.c3p0.preferredTestQuery">select 1;</property> 

Voici la trace:

org.hibernate.exception.JDBCConnectionException: could not execute query 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 
    at org.hibernate.loader.Loader.doList(Loader.java:2223) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104) 
    at org.hibernate.loader.Loader.list(Loader.java:2099) 
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94) 
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1569) 
    at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283) 
    at com.billing.dao.VmplanDAO.findByExample(VmplanDAO.java:178) 
    at com.billing.action.getVmplans.processRequest(getVmplans.java:37) 
    at com.billing.action.getVmplans.doGet(getVmplans.java:91) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Thread.java:619) 
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 

Last packet sent to the server was 0 ms ago. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) 
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074) 
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2985) 
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2871) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3414) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542) 
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734) 
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1885) 
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76) 
    at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186) 
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1787) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:674) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) 
    at org.hibernate.loader.Loader.doList(Loader.java:2220) 
    ... 25 more 
Caused by: java.net.SocketException: Software caused connection abort: recv failed 
    at java.net.SocketInputStream.socketRead0(Native Method) 
    at java.net.SocketInputStream.read(SocketInputStream.java:129) 
    at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:113) 
    at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:160) 
    at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:188) 
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2428) 
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2882) 
    ... 38 more 
java.lang.NullPointerException 
java.lang.NullPointerException 
    at com.billing.action.getVmplans.processRequest(getVmplans.java:38) 
    at com.billing.action.getVmplans.doGet(getVmplans.java:91) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Thread.java:619) 
+0

Voir http://stackoverflow.com/questions/730827/hibernate-c3p0-mysql-broken-pipe – nos

+0

Cela ne fonctionne toujours pas – leon

+0

Les paramètres sont corrects. Etes-vous sûr que Hibernate utilise le fichier cfg que vous pensez utiliser? – BalusC

Répondre

1

Pour être très honnête, il y a trois solutions à votre problèmes. Je vais vous expliquer chaque solution et les avantages et les inconvénients de chaque solution (viendra à votre cas dans le dernier)

  1. configure propriété wait_time_out dans MySQL my.ini pour vous assurer que vos connexions sont chronométrés sur. Cette approche va certainement fonctionner mais ce n'est pas une bonne solution. vous aimeriez manipuler cette chose dans votre application plutôt que dans la base de données parce que parfois vous pourriez ne pas avoir autant de contrôle sur la base de données ou une autre application pourrait utiliser la même base de données.

  2. Utilisez apache dbcp au lieu de c3p0. Vous pouvez configurer le dbcp dans context.xml de votre serveur où vous donnez le nom de la base de données. Cette approche fonctionnera, mais le problème avec cette approche est que vous pourriez envisager de passer à un autre serveur d'application dire JBOSS à l'avenir, dans ce cas, je ne suis pas apache dbcp fonctionnera ou non. Je ne l'ai pas essayé avec jboss mais je suppose que ce ne sera pas le cas.

  3. troisième voie est ce que vous avez opté pour

Dans votre cas, il vous manque une propriété, qui est

<property name="connection.provider_class"> 
    org.hibernate.connection.C3P0ConnectionProvider 
</property> 

Jusqu'à présent, vous devez avoir remarqué lors de votre démarrage du serveur qui c3p0 n'est pas initialisé du tout. Eh bien, si vous pensez après avoir défini cette propriété, votre code fonctionnera, je suis désolé de le dire, ce ne sera pas le cas.

Ceci est dû à un bug dans le code du ressort. vous pouvez vérifier cela en regardant le code source de LocalSessionFactoryBean, où il ignore simplement la valeur de la propriété définie ci-dessus et la définit sur LocalDataSourceConnectionProvider et votre c3p0 n'est jamais initialisé.

Vous pouvez fournir l'implémentation personnalisée de LocalSessionFactoryBean, où vous pouvez coder en dur la classe du fournisseur à C3P0ConnectionProvider.

Maintenant, redémarrez le serveur et notez que votre c3p0 est initialisé et que vous pouvez maintenant gérer les détails de c3p0.

Problème jusqu'à maintenant avec vous est que c3p0 n'est jamais initialisé et est hors de l'image.

Espérons que cela aide.

Questions connexes