2012-05-22 5 views
5

나는 웹 사이트 및 여러 모바일 클라이언트를 구동하는 서버 쪽 응용 프로그램을 작성했습니다. 데이터 접근을 위해 Hibernate를 사용했다. 나는 그 앱이 하루가 지나도 실패한 것을 나중에 발견했다! 내가 온라인에서 확인한 결과, 8 시간 후에 "부실한"연결을 종료하는 MySQL의 문제점을 잘 알고있었습니다. 이 문제를 피하기 위해 ?autoReconnect=true, c3P0 등을 포함한 많은 제안을 발견했습니다. autoReconnect은 공식적으로 (특히 프로덕션 환경에서는) 권장되지 않으며 적용했을 때 효과가 없었기 때문에 c3p0입니다. 아쉽게도 hibernate.cfg.xml 파일에 c3p0 구성을 도입하면 응용 프로그램에서 이라는 NullPointerException 어딘가에 던지기 시작합니다. 즉, 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을 설정하기위한 "초보자 친화적 인"구현하기 쉬운 단계별 절차를 도와주세요. 저는 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> 

내가 (SLF4J없이) C3P0를 추가 한 후 뭐가입니다 :

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 마법사를 사용하여 구성 파일, 엔티티 클래스 및 매핑 파일을 생성했습니다. 이들은 c3p0를 도입하기 전에 제대로 작동했습니다 (그러나 8 시간 후에 실패합니다). Mecurial을 프로젝트에 사용하고 전체 프로젝트를 c3p0을 도입하기 전의 상태로 되 돌리면 다시 작동합니다 (8 시간 동안). hibernate.cfg.xml에서 모든 c3p0 설정을 손으로 삭제조차도 앱이 다시 작동합니다. 무엇이 잘못 될 수 있습니까? C3P0 구성에 필요한

+0

NPE의 stacktrace뿐만 아니라 Hibernate (대표 코드 샘플)를 사용하여 작업하는 패턴을 보여 주시겠습니까? –

답변

7

항아리는 c3p0-0.9.2-pre2.jar & mchange - 평민 - 자바-0.2.1.jar 있습니다. 또한, 추가로 c3p0.properties을 classpath에 넣어야합니다.

다음은 최대 절전 모드에서 C3P0을 사용하는 동안 구성해야하는 등록 정보입니다.

있는 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 파일을 포함시킨 후에는 클래스 경로에 SLF4J jar 파일을 추가해야합니다. 이 문제에 대한 속임수는 SLF4J 항아리가 없으면 컴파일러는 여전히 불평하지 않을 것이며 앱을 배포 한 후에 만 ​​오류가 발생한다는 것입니다. 또한 Netbeans을 사용하는 경우 slf4.org에 함께 번들로 제공된 모든 병에서 SLF4J 라이브러리를 만들지 마십시오. here 그 항아리 중 일부는 같은 프로젝트에서 함께 사용되지 않기 때문입니다. 라이브러리에서 다음 두 개의 jar를 단독으로 사용하십시오 : slf4j-api-1.6.4.jar 및 slf4j-jdk14-1.6.4.jar. 자세한 내용은 www.slf4j.org을 참조하십시오.

1

c3p0은 SLF4J에 종속되지 않습니다. 해당 라이브러리를 클래스 패스에 추가하면 문제가 해결되지만 흥미롭지 만 설명하기는 쉽지 않습니다.

문제가있을 때 기록 된 원본 NPE 톰캣의 스택 추적이 도움이 될 것입니다. (저는 c3p0의 개발자입니다.)

c3p0.properties는 앱의 CLASSPATH의 최상위 레벨에 있어야하며 다른 설정 파일이있는 곳이 아닐 수 있습니다. c3p0.properties는 ClassLoader 자원으로로드됩니다.

+0

일부 로그를 포함하도록 게시물을 편집했습니다. –