【问题标题】:Hibernate/MySQL Connection Timeout休眠/MySQL 连接超时
【发布时间】:2012-05-28 12:44:11
【问题描述】:

我编写了一个为网站和多个移动客户端提供支持的服务器端应用程序。我使用 Hibernate 进行数据访问。后来我发现应用程序在一天后失败了!当我在网上查看时,我发现 MySQL 在 8 小时后终止“陈旧”连接是一个众所周知的问题。为了避免这种情况,我发现了很多建议,比如包括?autoReconnect=true、使用c3P0等。 由于官方不鼓励autoReconnect(尤其是在生产环境中),也因为我应用它时没有任何效果,所以我决定去c3p0。不幸的是,在我的hibernate.cfg.xml 文件中引入c3p0 配置后,应用程序开始在我调用dbSession.close() 的代码中的某处抛出NullPointerException 这意味着HibernateUtil.getSessionFactory() 实际上返回null。我已经添加了所需的罐子(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

<?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.

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

【问题讨论】:

  • 您是否介意向我们展示 NPE 的堆栈跟踪以及您使用 Hibernate 的模式(基本上是代表性代码示例)?

标签: java mysql hibernate connection-pooling c3p0


【解决方案1】:

C3P0 配置所需的 jar 是 c3p0-0.9.2-pre2.jarmchange-commons-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

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

【讨论】:

  • 非常感谢。请问c3p0.acquireRetryAttempts = 4c3p0.acquireRetryDelay=5000去哪里?
  • 这似乎也不起作用。请问我的 HibernateUtil.java 应该是什么样子的?
  • @SayoStealth-virusOladeji 提到的这两个属性都需要放在 c3p0.properties 文件中。可能对 HibernateUtil.java 没有影响,它不受影响。您可以尝试testConnectionOnCheckout 或这两个属性。
  • 我的 c3p0.properties 文件现在与 hibernate.cfg.xml 位于同一目录中,但我仍然得到 NullPointerException。
  • @SayoStealth-virusOladeji 编辑 hibernate.cfg.xml 内容,也尝试进一步调试,是 sessionFactory 返回 null 还是 dbSession 为 null。这些配置文件必须在项目类路径中
【解决方案2】:

c3p0 不依赖于 SLF4J。如果将该库添加到您的类路径可以解决您的问题,那很有趣,但并不容易解释。

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

请注意,c3p0.properties 需要位于您应用的 CLASSPATH 的顶​​层,而其他配置文件可能不在此位置。 c3p0.properties 作为 ClassLoader 资源加载。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2012-03-31
      • 1970-01-01
      • 2012-01-06
      • 2013-04-20
      • 2013-02-05
      • 2012-03-01
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多