我写了一个服务器端应用程序,为网站和多个移动客户端提供支持。我使用Hibernate进行数据访问。我后来发现应用程序在一天后失败了!当我在网上查看时,我发现它是一个众所周知的问题,MySQL在8小时后终止了“陈旧”的连接。为了避免这种情况,我发现了许多建议,例如包括?autoReconnect=true
,使用c3P0
等。
由于autoReconnect
官方不鼓励(特别是在生产环境中),并且因为它在我应用时没有任何效果,所以我决定去c3p0
。不幸的是,在我的c3p0
文件中引入hibernate.cfg.xml
配置后,应用程序开始在我的代码中的某个地方抛出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
<?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配置也会使应用程序再次运行。 我可能做错了什么?
答案 0 :(得分:7)
C3P0配置所需的罐子是 c3p0-0.9.2-pre2.jar &amp; 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
这将在每次连续尝试之间重试4次,延迟5秒。
答案 1 :(得分:1)
c3p0与SLF4J无关。如果将该库添加到类路径中可以解决您的问题,那很有意思,但不是那么容易解释。
遇到问题时记录的原始NPE tomcat的堆栈跟踪会很有帮助。 (我是c3p0的开发人员。)
请注意,c3p0.properties需要位于应用程序的CLASSPATH的顶层,这可能不是其他配置文件所在的位置。 c3p0.properties作为ClassLoader资源加载。
答案 2 :(得分:0)
可以使用上面建议的商业池库来修复错误。我完全按照@NayanWadekar的建议使用了c3p0。 请注意,c3p0依赖于SLF4J。因此,在类路径中包含c3p0 jar之后,还必须在类路径中添加SLF4J jar。关于这个问题的诀窍是,如果那些SLF4J罐子不存在,编译器仍然不会抱怨,你只是在部署应用程序后得到错误。 此外,如果您使用的是Netbeans,请避免在slf4.org上捆绑在一起的所有jar中创建一个SLF4J库here。原因是某些罐子不打算在同一个项目中一起使用。只需从库中单独使用以下两个jar:slf4j-api-1.6.4.jar和slf4j-jdk14-1.6.4.jar。您可以访问www.slf4j.org了解详情。