2012-05-22 21 views
5

मैं एक सर्वर साइड अनुप्रयोग है कि शक्तियों के लिए एक वेबसाइट है और कई मोबाइल ग्राहकों के लिए लिखा था। मैंने डेटा एक्सेस के लिए हाइबरनेट का उपयोग किया। बाद में मैंने पाया कि ऐप एक दिन के बाद विफल रहता है! जब मैंने ऑनलाइन चारों ओर चेक किया, तो मुझे पता चला कि यह 8 घंटे के बाद "स्टेल" कनेक्शन को समाप्त करने वाले MySQL के साथ एक अच्छी तरह से ज्ञात समस्या है। आदेश में इस से बचने के लिए, मैं ?autoReconnect=true सहित c3P0 का उपयोग कर, आदि autoReconnect के बाद से आधिकारिक तौर पर हतोत्साहित किया जाता है (विशेष रूप से उत्पादन वातावरण में) और इसलिए भी कि यह कोई असर जब मैं इसे लागू नहीं था जैसे कई सुझाव नहीं मिले, मैं जाने का फैसला किया c3p0 के लिए। दुर्भाग्य से, मेरी hibernate.cfg.xml फ़ाइल में c3p0 विन्यास को शुरू करने के बाद, आवेदन मेरी कोड में एक NullPointerException कहीं फेंक मैं कहाँ बुलाया dbSession.close() इसका मतलब है कि HibernateUtil.getSessionFactory() वास्तव में null रिटर्न शुरू होता है। (C3p0-0.9.2-pre2.jar, हाइबरनेट कोर-3.3.1.GA.jar, हाइबरनेट-c3p0-3.3.2.GA.jar, mchange-कॉमन्स-जावा-0.2.1 मैं आवश्यक जार जोड़ लिया है .jar और c3p0-oracle-thin-extras-0.9.2-pre2.jar) भले ही मैं उन सभी को नहीं सोचता जो आवश्यक हैं। मैं पृष्ठों है कि इस मुद्दे के बारे में बात के कई पूरी कर चुके हैं लेकिन मैं अभी भी इसे ठीक से सेट अप करने में सक्षम नहीं हूँ। कृपया मुझे "शुरुआती-अनुकूल" आसान-से-लागू, c3p0 को हाइबरनेट के साथ सेट अप करने के लिए चरण-दर-चरण प्रक्रिया के साथ सहायता करें। मैं जेडीके 1.6, माइस्क्लुएल 5.5 पर हाइबरनेट 3.3.6 का उपयोग कर रहा हूं और मैं नेटबीन्स 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 द्वारा उत्पन्न के अधिकांश। मेरे पास जमीन पर डेटाबेस था, फिर मैंने नेटबीन्स में हाइबरनेट विज़ार्ड का उपयोग कॉन्फ़िगरेशन फाइलें, इकाई वर्ग और मैपिंग फ़ाइलों को उत्पन्न करने के लिए किया था। सी 3 पी 0 पेश करने से पहले ये ठीक से काम कर रहे थे (लेकिन वे 8 घंटे बाद विफल हो गए)। मैं अपने प्रोजेक्ट के साथ Mecurial का उपयोग करें और पूरी परियोजना को वापस लाने में वापस एक समय जब मैं c3p0 शुरू की करने से पहले, यह फिर से (8 घंटे के लिए) काम करता है। यहां तक ​​कि hibernate.cfg.xml में सभी c3p0 कॉन्फ़िगरेशन को हाथ से हटाने से ऐप फिर से काम करता है। मैं गलत क्या कर सकता था?

+0

क्या आप हमें एनपीई के स्टैकट्रैक के साथ-साथ हाइबरनेट (प्रतिनिधि कोड नमूने मूल रूप से) के साथ काम करने के अपने पैटर्न दिखाएंगे? –

उत्तर

7

C3P0 विन्यास के लिए आवश्यक जार c3p0-0.9.2-pre2.jar & mchange-कॉमन्स-जावा-0.2.1.jar हैं। इसके अलावा, अतिरिक्त आप classpath में c3p0.properties डाल करने के लिए की जरूरत है।

नीचे गुण है, जो हाइबरनेट साथ 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 जार को शामिल करने के बाद, आपको अपने क्लासपाथ में एसएलएफ 4 जे जार भी जोड़ना होगा। इस बात की चाल यह है कि, यदि उन एसएलएफ 4 जे जार मौजूद नहीं हैं, तो संकलक अभी भी शिकायत नहीं करेगा, आपको ऐप को तैनात करने के बाद ही त्रुटियां मिलती हैं। इसके अलावा, यदि आप नेटबीन्स का उपयोग कर रहे हैं, तो slf4.org पर here को एक साथ बंडल किए गए सभी जारों से एक SLF4J लाइब्रेरी बनाने से बचें। इसका कारण यह है कि कुछ जार एक ही प्रोजेक्ट में एक साथ उपयोग करने के लिए नहीं हैं। लाइब्रेरी से केवल निम्नलिखित दो जार का उपयोग करें: slf4j-api-1.6.4.jar और slf4j-jdk14-1.6.4.jar। विवरण के लिए आप www.slf4j.org पर जा सकते हैं।

1

c3p0 SLF4J पर कोई निर्भरता नहीं है। यदि आपके क्लासपाथ में उस लाइब्रेरी को जोड़ना आपकी समस्या को ठीक करता है, तो यह दिलचस्प है, लेकिन समझाने में इतना आसान नहीं है।

जब आपको समस्याएं थीं तो मूल एनपीई टॉमकैट का एक स्टैक ट्रेस लॉग इन होगा। (मैं c3p0 के डेवलपर हूं।)

ध्यान दें कि c3p0.properties को आपके ऐप के क्लासस्पैट के शीर्ष स्तर पर होना चाहिए, जो अन्य कॉन्फ़िगरेशन फ़ाइलें कहां स्थित नहीं हो सकती हैं। c3p0.properties को क्लासलोडर संसाधन के रूप में लोड किया जाता है।

+0

मैंने कुछ लॉग शामिल करने के लिए पोस्ट संपादित किया है। –

संबंधित मुद्दे