2012-05-22 202 views
5

我寫了一個服務器端應用程序,爲網站和多個移動客戶端提供動力。我使用Hibernate進行數據訪問。我後來發現應用程序在一天後失敗!當我在網上查了一下時,發現它在MySQL 8小時後終止一個「過時」連接的問題。爲了避免這種情況,我發現了很多建議,如包括?autoReconnect=true,使用c3P0等。 由於autoReconnect已被官方勸阻(特別是在生產環境中),並且因爲它在應用時沒有任何影響,我決定去爲c3p0。不幸的是,我的hibernate.cfg.xml文件引入c3p0配置後,應用程序啓動時拋出NullPointerException地方在我的代碼,我叫dbSession.close() 這意味着HibernateUtil.getSessionFactory()實際返回null。我添加了所需的jar(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和c3p0-oracle-thin-extras-0.9.2-pre2.jar),儘管我不認爲它們都是必需的。 我已經瀏覽了很多討論過這個問題的網頁,但我仍然無法正確設置它。請幫助我使用「初學者友好型」易於實現的分步程序,用Hibernate設置c3p0。我在JDK 1.6,MySQL 5.5上使用Hibernate 3.3.6,我在Netbeans 7.0中開發。休眠/ MySQL連接超時

這裏是我的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> 

這是我加入C3P0(不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. 

大部分由地方產生的Netbeans我的Hibernate配置文件。我在地面上有數據庫,然後使用Netbeans中的Hibernate嚮導來從中生成配置文件,實體類和映射文件。這些工作在我引入c3p0之前正常工作(但8小時後失敗)。 我在項目中使用了Mecurial,並將整個項目恢復到了我介紹c3p0之前的一段時間,它再次運行(8小時)。即使手動刪除hibernate.cfg.xml中的所有c3p0配置,也會使應用程序再次運行。 我可能做錯了什麼?

+0

你能介紹一下NPE的stacktrace以及你使用Hibernate的模式(基本代表代碼示例)嗎? –

回答

7

爲C3P0配置所需的罐子c3p0-0.9.2-pre2.jar & mchange-公地java的0.2.1.jar。此外,您還需要將c3p0.properties放在類路徑中。

下面是屬性,在使用C3P0和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

  • 您可以驗證每個結賬c3p0.testConnectionOnCheckout=true連接,但這是昂貴的操作。

  • 否則,您可以重試定期建立連接。

    c3p0.acquireRetryAttempts = 4
    c3p0.acquireRetryDelay = 5000

    這將5秒每個連續嘗試之間的延遲重試的4倍。

+0

非常感謝。請'c3p0.acquireRetryAttempts = 4''c3p0.acquireRetryDelay = 5000'去哪裏? –

+0

這似乎也不起作用。請問我的HibernateUtil.java應該是什麼樣子? –

+0

@ SayoStealth-virusOladeji提到的這兩個屬性都需要放在c3p0.properties文件中。可能對HibernateUtil.java沒有影響,它不受影響。您可以嘗試'testConnectionOnCheckout'或這兩個屬性。 –

0

該錯誤可以使用上面建議的商業彙集庫來修復。我完全按照@NayanWadekar的建議使用c3p0。 請注意,c3p0依賴於SLF4J。因此,在你的類路徑中包含c3p0 jar之後,你還必須在classpath中添加SLF4J jar。關於這件事的技巧是,如果那些SLF4J罐子不存在,編譯器仍然不會抱怨,你只會在部署應用程序後出錯。 另外,如果您使用的是Netbeans,請避免在slf4.org上捆綁在一起的所有瓶子here創建一個SLF4J庫。原因是有些罐子並不意味着要在同一個項目中一起使用。只需從庫中單獨使用以下兩個罐子:slf4j-api-1.6.4.jar和slf4j-jdk14-1.6.4.jar。詳情請參閱www.slf4j.org

1

c3p0不依賴於SLF4J。如果將該庫添加到類路徑中解決了您的問題,那很有趣,但不容易解釋。

當您遇到問題時記錄原始NPE tomcat的堆棧跟蹤將會有所幫助。 (我是c3p0的開發人員。)

請注意,c3p0.properties需要位於應用程序的CLASSPATH的頂層,這可能不是其他配置文件所在的位置。 c3p0.properties作爲ClassLoader資源加載。

+0

我已編輯帖子以包含一些日誌。 –