2012-05-22 17 views
5

Napisałem aplikację po stronie serwera, która zasila stronę internetową i wielu klientów mobilnych. Użyłem Hibernate dla dostępu do danych. Później odkryłem, że aplikacja nie działa po jednym dniu! Kiedy sprawdziłem online, dowiedziałem się, że jest to dobrze znany problem z MySQL kończącym "nieaktualne" połączenie po 8 godzinach. Aby tego uniknąć, znalazłem wiele sugestii, takich jak: ?autoReconnect=true, używanie c3P0, itp. Od autoReconnect jest oficjalnie odradzane (szczególnie w środowisku produkcyjnym), a także dlatego, że nie miało żadnego wpływu, gdy zastosowałem go, zdecydowałem się iść dla c3p0. Niestety, po wprowadzeniu konfiguracji c3p0 w moim pliku hibernate.cfg.xml aplikacja rozpoczyna rzucanie NullPointerException gdzieś w moim kodu, gdzie zadzwoniłem dbSession.close() Oznacza to, że HibernateUtil.getSessionFactory() faktycznie zwraca null. Dodałem wymagane słoiki (c3p0-0.9.2-pre2.jar, hibernate-core-3.3.1.GA.jar, hibernacja-c3p0-3.3.2.GA.jar, mchange-commons-java-0.2.1 .jar i c3p0-oracle-thin-extras-0.9.2-pre2.jar), chociaż nie sądzę, że wszystkie z nich są wymagane. Przeszedłem przez wiele stron, które mówiły o tym problemie, ale nadal nie jestem w stanie prawidłowo go skonfigurować. Uprzejmie pomóż mi w "łatwej do wdrożenia" łatwej do wdrożenia, krok po kroku procedurze konfiguracji c3p0 z Hibernate. Używam Hibernuj 3.3.6 na JDK 1.6, MySQL 5.5 i rozwijam się w Netbeans 7.0.Czas oczekiwania na połączenie Hibernacja/MySQL

Oto moja 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> 

Oto co mam po dodaniu C3P0 (bez 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. 

Większość moich plikach konfiguracyjnych Hibernate gdzie generowanych przez Netbeans. Miałem bazę danych na ziemi, a następnie użyłem kreatorów Hibernate w Netbeans do wygenerowania plików konfiguracyjnych, klas encji i plików mapujących z niego. Działały one poprawnie przed wprowadzeniem c3p0 (ale nie działają po 8 godzinach). Używam Mecurial z moim projektem i cofam cały projekt z powrotem do czasu sprzed wprowadzenia c3p0, działa on ponownie (przez 8 godzin). Nawet ręczne usunięcie wszystkich konfiguracji c3p0 w hibernate.cfg.xml powoduje, że aplikacja działa ponownie. Co mogłem robić źle?

+0

czy mógłby Pan pokazać nam stos stosu NPE, a także wasze wzorce pracy z Hibernate (w zasadzie reprezentatywne próbki kodu)? –

Odpowiedz

7

Słoje wymagane do konfiguracji C3P0 są c3p0-0.9.2-pre2.jar & mchange-commons-java-0.2.1.jar. Ponadto musisz umieścić w ścieżce klasy c3p0.properties.

Poniżej znajdują się właściwości, które należy skonfigurować podczas używania C3P0 w trybie hibernacji.

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

  • Można sprawdzić poprawność połączenia na każdej kasie c3p0.testConnectionOnCheckout=true, ale to kosztowna operacja.

  • W przeciwnym razie można spróbować ponownie, aby nawiązać połączenie okresowo.

    c3p0.acquireRetryAttempts = 4
    c3p0.acquireRetryDelay = 5000

    To ponownie 4-krotnie upływie 5 sekund między każdym kolejnym podejściu.

+0

Wielkie dzięki. Gdzie należy wpisać 'c3p0.acquireRetryAttempts = 4'' c3p0.acquireRetryDelay = 5000'? –

+0

To też nie działa. Czy mogę zapytać, jak powinna wyglądać moja wersja HibernateUtil.java? –

+0

@ SayoStealth-virusOladeji Obie wymienione właściwości muszą zostać umieszczone w pliku c3p0.properties. Prawdopodobnie nie ma wpływu na HibernateUtil.java, nie ma to wpływu. Możesz wypróbować 'testConnectionOnCheckout' lub te dwie właściwości. –

0

Błąd można naprawić za pomocą komercyjnych bibliotek puli, jak zasugerowano powyżej. Użyłem c3p0 dokładnie tak, jak zasugerował @NayanWadekar. Należy pamiętać, że c3p0 zależy od SLF4J. Więc po dodaniu słoików c3p0 do swojej ścieżki klas, musisz również dodać słoiki SLF4J w ścieżce klas. Sztuczka o tym polega na tym, że jeśli te słoiki SLF4J nie są obecne, kompilator nadal nie będzie narzekał, pojawią się tylko błędy po wdrożeniu aplikacji. Ponadto, jeśli używasz Netbeans, unikaj tworzenia biblioteki SLF4J ze wszystkich słoików w pakiecie here na slf4.org. Powodem jest to, że niektóre słoiki nie mają być używane razem w tym samym projekcie. Wystarczy użyć następujących dwóch słoików z biblioteki: slf4j-api-1.6.4.jar i slf4j-jdk14-1.6.4.jar. Więcej informacji można znaleźć na stronie www.slf4j.org.

1

c3p0 nie ma zależności od SLF4J. Dodanie tej biblioteki do ścieżki klasowej rozwiązało problem, co jest interesujące, ale niełatwe do wyjaśnienia.

Śledzenie stosu oryginalnego tomcat NPE rejestrowanego w razie problemów byłoby pomocne. (Jestem programistą c3p0.)

Należy zauważyć, że c3p0.properties musi znajdować się na najwyższym poziomie zmiennej CLASSPATH aplikacji, która może nie znajdować się w miejscu innych plików konfiguracyjnych. Plik c3p0.properties jest ładowany jako zasób ClassLoader.

+0

Edytowałem post, aby uwzględnić niektóre dzienniki. –

Powiązane problemy