2009-04-08 16 views
15

MySQL के कनेक्शन पर 8 घंटे का समय लगता है। मैं ओआरएम के लिए हाइबरनेट का उपयोग करते हुए टोमकैट में कई WAR चला रहा हूं। 8 घंटों के बाद (यानी रातोंरात), जब मैं निष्क्रिय कनेक्शन उठाता हूं तो मुझे टूटी हुई पाइप मिलती है।हाइबरनेट, सी 3 पी 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.bytecode.use_reflection_optimizer">false</property> 
    <property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property> 
    <property name="hibernate.connection.password"></property> 
    <property name="hibernate.connection.url">jdbc:mysql://localhost/test</property> 
    <property name="hibernate.connection.username">root</property> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> 
    <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property> 
    <property name="hibernate.current_session_context_class">thread</property> 
    <!--property name="hibernate.show_sql">true</property> 
    <property name="hibernate.format_sql">true</property--> 

    <property name="c3p0.min_size">3</property> 
    <property name="c3p0.max_size">5</property> 
    <property name="c3p0.timeout">1800</property> 
    <property name="c3p0.preferredTestQuery">SELECT 1</property> 
    <property name="c3p0.testConnectionOnCheckout">true</property> 
    <property name="c3p0.idle_test_period">100</property> <!-- seconds --> 

    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 
    <property name="cache.use_query_cache">false</property> 
    <property name="cache.use_minimal_puts">false</property> 
    <property name="max_fetch_depth">10</property> 

    <property name="hibernate.hbm2ddl.auto">update</property> 

    <!-- classes removed --> 

</session-factory> 

पैरामीटर मैंने सोचा था कि तय है | यह c3p0.idle_test_period था - 0 पर यह चूक हालांकि, हम अभी भी टूटी पाइप मुद्दा है चलने के 8 घंटे बाद। हालांकि Google के माध्यम से कई पोस्ट इंडेक्स हैं, कोई भी संतोषजनक उत्तर नहीं देता है।

उत्तर

23

के बजाय hibernate.c3p0.idle_test_period तो यह पता चला है मैं एक महत्वपूर्ण बात यह है कि c3p0 (सक्षम याद आ रही थी c3p0 मापदंडों मैं कोई प्रभाव नहीं कर रहे थे क्योंकि हाइबरनेट उपयोग कर रहा था यह कनेक्शन पूल में बनाया गया है फेरबदल किया गया था - जो इसे उचित रूप से चेतावनी दी है उत्पादन के लिए उपयुक्त नहीं है)। हाइबरनेट 2.x में, hibernate.c3p0.max_size प्रॉपर्टी सक्षम c3p0 कनेक्शन पूलिंग सेट करना। हालांकि, 3.x में आप निम्नलिखित संपत्ति का विवरण देना चाहिए - इसके अतिरिक्त

<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> 

, यहाँ मेरा अंतिम कॉन्फ़िगरेशन पैरामीटर कर रहे हैं -

<property name="hibernate.c3p0.min_size">3</property> 
<property name="hibernate.c3p0.max_size">5</property> 
<property name="hibernate.c3p0.timeout">1800</property> 
<property name="hibernate.c3p0.idle_test_period">100</property> <!-- seconds --> 

यह बल्कि दुर्भाग्यपूर्ण दोनों हाइबरनेट और c3p0 में मात्र दस्तावेज है कि इस संबंध में।

+0

धन्यवाद, इससे मेरी मदद मिली। मैं प्रलेखन टिप्पणी से सहमत हूं। इससे भी बदतर, c3p0 दस्तावेज आपको उपरोक्त 5 को छोड़कर अन्य सभी के लिए c3p0.properties का उपयोग करने की सलाह देता है, लेकिन यह काम नहीं करता है। यह केवल तब काम करता है जब आप hibernate prefix के बिना persistence.xml में निर्दिष्ट करते हैं (जैसा कि आपने अपने मूल cfg.xml में किया है) – Sun

+0

इससे मुझे भी मदद मिली ... मैं प्रलेखन की बात के बारे में सहमत हूं :)। यह उनके दस्तावेज में थोड़ा और सरल हो सकता है। – Polaris878

+0

यदि आपने CombPooledDataSource के लिए xml कॉन्फ़िगरेशन का उपयोग किया है तो संपत्ति 'idleConnectionTestPeriod' है जिसे आपको होना चाहिए। –

2

यहां दो चीजें चल रही हैं। आप अधिक जानकारी के लिए this article पढ़ना चाहिए, लेकिन ले aways हैं:

  1. आप अगर वांछित, 8 घंटे से भी बड़ा कुछ करने के लिए MySQL wait_timeout सेटिंग को समायोजित कर सकते हैं।
  2. हाइबरनेट सेटिंग्स में "हाइबरनेट" शामिल होना चाहिए। "c3p0" से पहले, उदा। बस c3p0.idle_test_period
+0

मैं आज हाइबरनेट उपसर्ग जोड़ने की कोशिश करूंगा। मुझे नहीं लगता कि MySQL wait_timeout को विस्तारित करने में मदद मिलेगी ... मैं बस टूटी हुई पाइप त्रुटि में देरी करूंगा। – Mark

1

मैं कई समस्या है - - C3P0ConnectionProvider नहीं मिला था - मैं हाइबरनेट c3p0 संस्करण

 <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>3.5.6-Final</version> 
    </dependency> 
      <!-- c3p0 --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-c3p0</artifactId> 
     <version>3.3.1.GA</version> 
    </dependency> 

का उपयोग करके इसे हल - मैं mysql पर wait_timeout मुद्दा यह है कि। सबसे पहले मैंने /etc/my.cnf wait_timeout = 10 सेट किया है, फिर मैंने निष्क्रिय समय आउट मान को wait_timeout मान से कम करने के लिए बदल दिया है जो मेरी समस्या हल हो गई।

<property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider" /> <property name="hibernate.c3p0.acquire_increment" value="1" /> 
     <property name="hibernate.c3p0.idle_test_period" value="28690"/> 
     <property name="hibernate.c3p0.timeout" value="1800" /> 
     <property name="hibernate.c3p0.max_size" value="5" /> 
     <property name="hibernate.c3p0.min_size" value="3" /> 
     <property name="hibernate.c3p0.max_statement" value="50" /> 
     <property name="hibernate.c3p0.preferredTestQuery" value="select 1;"/> 
2

यह एक समाधान है आप c3p0 में बिल्ला के wait_timeout = 28800 सेकंड (8h) और maxIdleTime = 0 के संयोजन की वजह से एक टूटी हुई पाइप है जब:

मैं बदल दिया है स्थानीय बिल्ला के माध्यम से wait_timeout मेरी .ini फ़ाइल 120sec (2 मिनट) करने के लिए।
maxIdleTime = 100
idleConnectionTestPeriod = 0 (डिफ़ॉल्ट रूप में एक ही/जैसे कि यह अस्तित्व में नहीं था)
अन्य:
acquireIncrement = 2
minPoolSize = 2
maxPoolSize = 5
और मैं निम्नलिखित रखा maxIdleTimeExcessConnections = 10

मुझे इस सेटअप में कोई समस्या नहीं थी।

मुझे idleConnectionTestPeriod का उपयोग करने की आवश्यकता नहीं थी!

यदि टॉमकैट का wait_timeout 28800 सेकेंड है, और maxIdleTime 25200 है, तो इसका मतलब है कि c3p0 पहले "टूटे पाइप" अपवाद को फेंकने से पहले 3600sec (1h) में निष्क्रिय कनेक्शन बंद कर देगा। क्या यह सही नहीं है ?!

जैसा कि आप देख सकते हैं कि मुझे केवल maxIdleTime प्रदान करने में कोई समस्या नहीं है।

दुर्भाग्य से, इन:
maxIdleTime
idleConnectionTestPeriod
configuring_connection_testing
testConnectionOnCheckin
बहुत ज्यादा कोने मामलों की व्याख्या नहीं करते।

और, Btw, यहाँ कैसे नोटपैड के साथ ++ बिल्ला के my.ini फ़ाइल खोलने के लिए है: http://drupal.org/node/32715#comment-4907440

चीयर्स,
तानाशाह

1

मैं एक ही समस्या हो रही थी और यह पता लगाने के लिए समय निकाला समाधान।

मैं हाइबरनेट 4.0.1 और MySQL 5.1 (कोई वसंत ढांचा नहीं) का उपयोग करता हूं और मुझे इस मुद्दे का सामना करना पड़ रहा था। सबसे पहले सुनिश्चित करें कि आपने c3p0 जार को ठीक से कॉन्फ़िगर किया है जो आवश्यक हैं।

मैं hibernate.cfg.xml

<property name="hibernate.c3p0.validate">true</property> 
<property name="hibernate.connection.provider_class">org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider</property> 
<property name="hibernate.c3p0.min_size">5</property> 
<property name="hibernate.c3p0.max_size">20</property> 
<property name="hibernate.c3p0.max_statements">50</property> 
<property name="hibernate.c3p0.preferredTestQuery">SELECT 1;</property> 
<property name="hibernate.c3p0.testConnectionOnCheckout">true</property> 
<property name="hibernate.c3p0.idle_test_period">10</property> 
<property name="hibernate.c3p0.acquireRetryAttempts">5</property> 
<property name="hibernate.c3p0.acquireRetryDelay">200</property> 
<property name="hibernate.c3p0.timeout">40</property> 

में इन गुणों का इस्तेमाल किया लेकिन यह 'किसी काम का नहीं है C3p0 अभी भी डिफ़ॉल्ट गुण गुण जो मैं hibernate.cfg.xml में सेट ले रहा था कारण नहीं, आप कर सकते हैं लॉग इन में जांचें। इसलिए, मैंने सही समाधान के लिए कई वेबसाइटों की खोज की और आखिर में मैं इसके साथ आया। cfg.xml में C3p0 गुणों को हटाएं और रूट पथ (cfg.xml के साथ) में c3p0-config.xml बनाएं और निम्नानुसार गुण सेट करें।

<c3p0-config> 
<default-config> 
<property name="automaticTestTable">con_test</property> 
<property name="checkoutTimeout">40</property> 
<property name="idleConnectionTestPeriod">10</property> 
<property name="initialPoolSize">10</property> 
<property name="maxPoolSize">20</property> 
<property name="minPoolSize">5</property> 
<property name="maxStatements">50</property> 
<property name="preferredTestQuery">SELECT 1;</property> 
<property name="acquireRetryAttempts">5</property> 
<property name="acquireRetryDelay">200</property> 
<property name="maxIdleTime">30</property> 
</default-config> 
</c3p0-config> 

लेकिन यदि आप चलाने के लिए, ORM JDBC कनेक्शन नहीं बल्कि C3p0 कनेक्शन पूल 'हम hibernate.cfg.xml में इन गुणों जोड़ना चाहिए कारण लेता

<property name="hibernate.c3p0.validate">true</property> 

<property name="hibernate.connection.provider_class">org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider</property> 

अब सब कुछ काम करता है ठीक (कम से कम यह मेरे लिए ठीक काम किया) और मुद्दा हल हो गया है।

संदर्भों के लिए निम्न जांचें।

http://www.mchange.com/projects/c3p0/index.html#configuring_connection_testing

https://community.jboss.org/wiki/HowToConfigureTheC3P0ConnectionPool

मुझे आशा है कि यह आपकी समस्या नहीं सुलझती।

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