2012-05-22 17 views
5

Ho scritto un'applicazione lato server che alimenta un sito Web e più client mobili. Ho usato Hibernate per l'accesso ai dati. Successivamente ho scoperto che l'app fallisce dopo un giorno! Quando ho controllato online, ho scoperto che è un problema ben noto con MySQL che termina una connessione "obsoleta" dopo 8 ore. Per evitare questo, ho trovato molti suggerimenti come ?autoReconnect=true, usando c3P0, ecc. Poiché autoReconnect è ufficialmente scoraggiato (soprattutto in ambiente di produzione) e anche perché non ha avuto alcun effetto quando l'ho applicato, ho deciso di andare per c3p0. Purtroppo, dopo l'introduzione della configurazione c3p0 nel mio file hibernate.cfg.xml, l'applicazione si avvia gettando un qualche NullPointerException nel mio codice in cui ho chiamato dbSession.close() Ciò significa che il HibernateUtil.getSessionFactory() in realtà restituisce null. Ho aggiunto i jar richiesti (c3p0-0.9.2-pre2.jar, hibernate-core-3.3.1.GA.jar, hibernate-c3p0-3.3.2.GA.jar, mchange-commons-java-0.2.1 .jar e c3p0-oracle-thin-extras-0.9.2-pre2.jar) anche se non penso che siano tutti necessari. Ho letto molte pagine che hanno parlato di questo problema, ma non riesco ancora a configurarlo correttamente. Gentilmente aiutatemi con una procedura passo-passo facile da implementare, facile da implementare, per impostare c3p0 con Hibernate. Sto usando Hibernate 3.3.6 su JDK 1.6, MySQL 5.5 e sto sviluppando in Netbeans 7.0.Timeout connessione Hibernate/MySQL

Ecco il mio hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/religion_app</property> 
    <property name="hibernate.connection.username">*****</property> 
    <property name="hibernate.connection.password">*****</property> 
    <property name="hibernate.show_sql">true</property> 
    <property name="hibernate.current_session_context_class">thread</property> 
    <property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property> 

    <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> 
    <property name="connection.autoReconnect">true</property> 
    <property name="connection.autoReconnectForPools">true</property> 
    <property name="connection.is-connection-validation-required">true</property> 

    <!-- configuration pool via c3p0--> 
    <property name="c3p0.acquire_increment">1</property> 
    <property name="c3p0.idle_test_period">120</property> <!-- seconds --> 
    <property name="c3p0.max_size">100</property> 
    <property name="c3p0.max_statements">0</property> 
    <property name="c3p0.min_size">10</property> 
    <property name="c3p0.timeout">180</property> <!-- seconds --> 
    <property name="c3p0.preferredTestQuery">select 1;</property> 

    <!--Mappings go here--> 
    </session-factory> 
</hibernate-configuration> 

Ecco quello che ho ottenuto dopo l'aggiunta c3p0 (senza slf4j):

May 23, 2012 2:42:14 AM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet LoginChurch threw exception 
java.lang.NullPointerException 
    at com.pacesolutions.religionapp.services.LoginChurch.processRequest(LoginChurch.java:109) 
    at com.pacesolutions.religionapp.services.LoginChurch.doPost(LoginChurch.java:138) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    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:393) 
    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.Http11AprProcessor.process(Http11AprProcessor.java:859) 
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579) 
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555) 
    at java.lang.Thread.run(Thread.java:722) 

May 23, 2012 2:45:13 AM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet LoginChurch threw exception 
java.lang.ClassNotFoundException: org.slf4j.LoggerFactory 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1361) 
    at org.hibernate.connection.C3P0ConnectionProvider.<clinit>(C3P0ConnectionProvider.java:52) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525) 
    at java.lang.Class.newInstance0(Class.java:372) 
    at java.lang.Class.newInstance(Class.java:325) 
    at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:73) 
    at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:56) 
    at org.hibernate.cfg.SettingsFactory.createConnectionProvider(SettingsFactory.java:414) 
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:62) 
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292) 
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859) 
    at com.pacesolutions.religionapp.HibernateUtil.<clinit>(HibernateUtil.java:23) 
    at com.pacesolutions.religionapp.services.LoginChurch.processRequest(LoginChurch.java:68) 
    at com.pacesolutions.religionapp.services.LoginChurch.doPost(LoginChurch.java:143) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    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:393) 
    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.Http11AprProcessor.process(Http11AprProcessor.java:859) 
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579) 
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555) 
    at java.lang.Thread.run(Thread.java:722) 


    note The full stack trace of the root cause is available in the Apache Tomcat/6.0.26 logs. 

maggior parte dei miei file di configurazione di Hibernate in cui generati da Netbeans. Avevo il database a terra, quindi ho usato le procedure guidate di Hibernate in Netbeans per generare i file di configurazione, le classi di entità e il mapping dei file da esso. Questi funzionavano correttamente prima di aver introdotto c3p0 (ma falliscono dopo 8 ore). Uso Mecurial con il mio progetto e riportando indietro l'intero progetto in un momento precedente a quando ho introdotto c3p0, funziona di nuovo (per 8 ore). Anche l'eliminazione manuale di tutte le configurazioni di c3p0 in hibernate.cfg.xml fa funzionare nuovamente l'app. Cosa potrei fare di sbagliato?

+0

ti dispiacerebbe mostrarci lo stacktrace di NPE nonché i tuoi schemi di funzionamento con Hibernate (esempi di codice rappresentativo in pratica)? –

risposta

7

I vasi necessari per la configurazione C3P0 sono c3p0-0.9.2-pre2.jar & mchange-commons-java-0.2.1.jar. Inoltre, è necessario aggiungere c3p0.properties in classpath.

Di seguito sono riportate le proprietà, che devono essere configurate durante l'utilizzo di C3P0 con Hibernate.

hibernate.cfg.xml

<property name="connection.provider_class"> 
       org.hibernate.connection.C3P0ConnectionProvider</property> 
<property name="hibernate.c3p0.acquire_increment">1</property> 
<property name="hibernate.c3p0.idle_test_period">100</property> 
<property name="hibernate.c3p0.max_size">100</property> 
<property name="hibernate.c3p0.max_statements">100</property> 
<property name="hibernate.c3p0.min_size">10</property> 
<property name="hibernate.c3p0.timeout">180</property> 

c3p0.properties

  • è possibile convalidare connessione su ogni cassa c3p0.testConnectionOnCheckout=true, ma questo è un'operazione costosa.

  • Altrimenti, è possibile riprovare per stabilire la connessione periodicamente.

    c3p0.acquireRetryAttempts = 4
    c3p0.acquireRetryDelay = 5000

    Questa ritenterà 4 volte con un ritardo di 5 secondi tra ogni tentativo consecutivo.

+0

Grazie mille. Per favore, dove si trova 'c3p0.acquireRetryAttempts = 4'' c3p0.acquireRetryDelay = 5000' go? –

+0

Anche questo non sembra funzionare. Posso chiedere come dovrebbe essere il mio HibernateUtil.java? –

+0

@ SayoStealth-virusOladeji Entrambe queste proprietà menzionate devono essere inserite nel file c3p0.properties. Probabilmente, non c'è alcun effetto su HibernateUtil.java, non è influenzato. Puoi provare "testConnectionOnCheckout" o queste due proprietà. –

0

Il bug può essere risolto utilizzando le librerie di pool commerciali come suggerito sopra. Ho usato c3p0 esattamente come suggerito da @NayanWadekar. Si prega di notare che c3p0 dipende da SLF4J. Quindi, dopo aver incluso i jar c3p0 nel classpath, è necessario aggiungere anche i jar SLF4J nel classpath. Il trucco di questa cosa è che, se questi vasi SLF4J non sono presenti, il compilatore continua a non lamentarsi, si ottengono solo errori dopo aver distribuito l'app. Inoltre, se si utilizza Netbeans, evitare di creare una libreria SLF4J da tutti i vasi raggruppati insieme here su slf4.org. Il motivo è che alcuni dei vasetti non sono pensati per essere usati insieme nello stesso progetto. Basta usare solo i seguenti due jar dalla libreria: slf4j-api-1.6.4.jar e slf4j-jdk14-1.6.4.jar. È possibile visitare www.slf4j.org per i dettagli.

1

c3p0 non ha alcuna dipendenza da SLF4J. Se aggiungere la libreria al classpath risolve il problema, è interessante, ma non così facile da spiegare.

Una traccia stack del tomcat NPE originale registrato quando si presentavano problemi sarebbe stata utile. (Sono lo sviluppatore di c3p0.)

Si noti che c3p0.properties deve essere al livello superiore del CLASSPATH della propria app, che potrebbe non essere il luogo in cui si trovano altri file di configurazione. c3p0.properties viene caricato come risorsa ClassLoader.

+0

Ho modificato il post per includere alcuni registri. –

Problemi correlati