Hibernate / MySQL连接超时

我写了一个服务器端应用程序,为网站和多个移动客户端提供支持。 我使用Hibernate进行数据访问。 我后来发现应用程序在一天后失败了! 当我在网上查看时,我发现它是一个众所周知的问题,MySQL在8小时后终止了“陈旧”的连接。 为了避免这种情况,我发现了许多建议,比如包括?autoReconnect=true ,使用c3P0等。由于autoReconnect正式c3P0 (特别是在生产环境中),并且因为它在我应用时没有任何效果,我决定去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)即使我不认为它们都是必需的。 我已经浏览了许多讨论这个问题的网页,但我仍然无法正确设置它。 请帮助我使用“初学者友好”易于实现的逐步程序来设置c3p0与Hibernate。 我在JDK 1.6,MySQL 5.5上使用Hibernate 3.3.6,我在Netbeans 7.0中开发。

这是我的hibernate.cfg.xml

     org.hibernate.dialect.MySQLDialect com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/religion_app ***** ***** true thread org.hibernate.hql.classic.ClassicQueryTranslatorFactory org.hibernate.connection.C3P0ConnectionProvider true true true  1 120  100 0 10 180  select 1;    

这是我添加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.(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.(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. 

我的大多数Hibernate配置文件都是由Netbeans生成的。 我在地面上有数据库然后我使用Netbeans中的Hibernate向导来生成配置文件,实体类和映射文件。 在我介绍c3p0之前它们正常工作(但是它们在8小时后失败了)。 我在项目中使用Mecurial并将整个项目恢复到我引入c3p0之前的时间,它再次工作(8小时)。 甚至手动删除hibernate.cfg.xml中的所有c3p0配置也会使应用程序再次运行。 我能做错什么?

C3P0配置所需的jar是c3p0-0.9.2-pre2.jarmchange-commons-java-0.2.1.jar 。 另外,您还需要在类路径中放置c3p0.properties

以下是在使用C3P0和Hibernate时应配置的属性。

的hibernate.cfg.xml

  org.hibernate.connection.C3P0ConnectionProvider 1 100 100 100 10 180 

c3p0.properties

  • 您可以在每个结帐时validation连接c3p0.testConnectionOnCheckout=true ,但这是c3p0.testConnectionOnCheckout=true昂贵的操作。

  • 否则,您可以定期重试建立连接。

    c3p0.acquireRetryAttempts = 4
    c3p0.acquireRetryDelay = 5000

    这将在每次连续尝试之间以5秒的延迟重试4次。

c3p0与SLF4J无关。 如果将该库添加到类路径中修复了您的问题,那很有意思,但不是那么容易解释。

当您遇到问题时,记录的原始NPE tomcat的堆栈跟踪会很有帮助。 (我是c3p0的开发人员。)

请注意,c3p0.properties需要位于应用程序的CLASSPATH的顶层,这可能不是其他配置文件所在的位置。 c3p0.properties作为ClassLoader资源加载。

如上所述,可以使用商业池库来修复错误。 我完全按照@NayanWadekar的建议使用了c3p0。 请注意,c3p0依赖于SLF4J。 因此,在类路径中包含c3p0 jar之后,还必须在类路径中添加SLF4J jar。 关于这个问题的诀窍是,如果那些SLF4Jjar子不存在,编译器仍然不会抱怨,你只会在部署应用程序后出错。 此外,如果您使用Netbeans,请避免在slf4.org上捆绑在一起的所有jar中创建SLF4J库。 原因是某些jar子不打算在同一个项目中一起使用。 只需从库中单独使用以下两个jar:slf4j-api-1.6.4.jar和slf4j-jdk14-1.6.4.jar。 您可以访问www.slf4j.org了解详情。