hibernate - डेडलॉक्स से बचने के लिए हाइबरनेट के लिए आवश्यक सी 3 पी 0 सेटिंग्स क्या हैं




c3p0 (4)

मैं MySQL 5.1.30 के साथ एक साथ हाइबरनेट का उपयोग करता हूं।

मेरे पास अगली पुस्तकालय हैं:

  • c3p0-0.0.1.2.jar
  • mysql-कनेक्टर-जावा-5.0.3-bin.jar
  • hibernate3.jar

मैं कॉन्फ़िगरेशन के लिए hibernate.cfg.xml का उपयोग करता हूं:

<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <!-- Database connection settings -->
        <property name="connection.driver_class">org.gjt.mm.mysql.Driver</property> 

        <property name="connection.url">jdbc:mysql://localhost/fooDatatbase</property>
    <property name="connection.username">foo</property>
    <property name="connection.password">foo123</property>

        <!-- Use the C3P0 connection pool provider -->
    <property name="hibernate.c3p0.min_size">5</property>
    <property name="hibernate.c3p0.max_size">20</property>
    <property name="hibernate.c3p0.timeout">300</property>
    <property name="hibernate.c3p0.max_statements">50</property>
    <property name="hibernate.c3p0.idle_test_periods">3000</property>       

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <mapping resource="databaselayer/mail/Mail.hbm.xml"/>
        <mapping resource="databaselayer/courses/Course.hbm.xml"/>
        <mapping resource="databaselayer/price/Price.hbm.xml"/>        
        <mapping resource="databaselayer/contact/Contact.hbm.xml"/>
        <mapping resource="databaselayer/artists/Musician.hbm.xml"/>
        <mapping resource="databaselayer/concerts/Concert.hbm.xml"/>     
        <mapping resource="databaselayer/welcome/Welcome.hbm.xml"/>
        <mapping resource="databaselayer/information/Information.hbm.xml"/>                             
    </session-factory>
</hibernate-configuration>

हाइबरनेट बुक के साथ जावा अवस्था में, c3p0 कॉन्फ़िगरेशन विकल्पों को समझाया गया है:

  • hibernate.c3p0.min_size यह जेडीबीसी कनेक्शन की न्यूनतम संख्या है जो C3P0 हर समय तैयार रहता है
  • hibernate.c3p0.max_size यह पूल में कनेक्शन की अधिकतम संख्या है। यदि यह संख्या समाप्त हो गई है तो रनटाइम पर एक अपवाद फेंक दिया जाता है।
  • hibernate.c3p0.timeout आप टाइमआउट अवधि निर्दिष्ट करते हैं (इस मामले में, 300 सेकंड) जिसके बाद पूल से निष्क्रिय कनेक्शन हटा दिया जाता है)।
  • hibernate.c3p0.max_statements कैश किए जाने वाले बयानों की अधिकतम संख्या। हाइबरनेट के साथ सर्वश्रेष्ठ प्रदर्शन के लिए तैयार बयानों की कैशिंग आवश्यक है।
  • hibernate.c3p0.idle_test_periods कनेक्शन स्वचालित रूप से मान्य होने से पहले सेकंड में यह iddle समय है।

मैं जावा 1.5.0_0 9 और टॉमकैट 6.0 का उपयोग करता हूं। मेरे पास टॉमकैट में तैनात तीन अनुप्रयोग हैं। उनमें से प्रत्येक एक ऊपर कॉन्फ़िगरेशन फ़ाइल के साथ हाइबरनेट का उपयोग करता है जो ऊपर दिखाया गया है (केवल उपयोगकर्ता नाम, डाटाबेसनाम, पासवर्ड और मैपिंग परिवर्तन को पुनर्स्थापित करता है)।

दुर्भाग्य से उपर्युक्त सेटिंग्स के साथ, कुछ घंटों के बाद मुझे कुछ बुरा डेडलॉक त्रुटियां मिलती हैं जो टोमकैट को मारने का अंत करती हैं।

Jan 22, 2009 3:29:07 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com[email protected]2437d -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
Jan 22, 2009 3:29:07 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com[email protected]1dc5cb7 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
Jan 22, 2009 3:29:07 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com[email protected]9cd2ef -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
Jan 22, 2009 3:29:07 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com[email protected]4af355 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
Jan 22, 2009 3:29:07 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com[email protected]1275fcb -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
Jan 22, 2009 3:29:35 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run

ऐसा लगता है कि कई लोगों को पहले से ही एक त्रुटि मिली है। मैंने अपनी सेटिंग्स को यहां वर्णित वर्कअराउंड का पालन करने की कोशिश की है http://forum.hibernate.org/viewtopic.php?p=2386237 से:

<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.min_size">0</property>
<property name="hibernate.c3p0.max_size">48</property>
<property name="hibernate.c3p0.timeout">0</property>
<property name="hibernate.c3p0.max_statements">0</property>

नई सेटिंग्स के साथ, मुझे डेडलॉक्स नहीं मिलते हैं, लेकिन मुझे मिलता है:

WARNING: SQL Error: 0, SQLState: 08S01
Jan 24, 2009 5:53:37 AM org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: Communications link failure due to underlying exception: 

** BEGIN NESTED EXCEPTION ** 

java.io.EOFException

STACKTRACE:

java.io.EOFException
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1913)

क्या कोई जानता है कि मैं क्या गलत कर रहा हूं, और मैं c3p0 को सही ढंग से कैसे सेट कर सकता हूं?


असल में यह शायद बहुत देर हो चुकी है, लेकिन समस्या काफी सरल है: hibernate.c3p0.idle_test_periods से अधिक नहीं hibernate.c3p0.idle_test_periods चाहिए या डेटाबेस द्वारा बंद कनेक्शन ठीक से नहीं पता चलेंगे।

इसके अलावा, आपके कोड के कुछ हिस्से की तरह डेडलॉक पहचान चेतावनियां पूल के कनेक्शन को ठीक तरह से वापस नहीं कर रही हैं (यानी session.close ())

MysqlIO अपवाद तब होते हैं जब आपका एप्लिकेशन निष्क्रिय होता है और MySQL सर्वर पर कनेक्शन बंद कर देता है। अब यदि सी 3 पी 0 सही तरीके से जांच नहीं करता है कि कनेक्शन अभी भी वास्तव में जुड़ा हुआ है तो आपको EOFExceptions मिलते हैं।

मुझे उम्मीद है कि यह सहायक हो सकता है।


इस प्रश्न का कोई निश्चित उत्तर नहीं है, क्योंकि यह उपयोग और लोड पैटर्न के आधार पर आवेदन से आवेदन में बदल जाता है।

पहला बिंदु लिंक https://www.hibernate.org/214.html को संदर्भित करता है, क्योंकि ऐसा लगता है कि आपने ऐसा किया है और आगे बढ़ गया है। यहां कुछ सलाह हैं;

  • numHelperThreads: सहायक धागे जो contended ताले नहीं पकड़ते हैं। कई धागे पर इन परिचालनों को फैलाना
  • maxStatements: c3p0 के वैश्विक तैयार स्टेमेंट कैश का आकार।
  • maxStatementsPerConnection: तैयार किए गए कनेक्शन c3p0 की संख्या एक एकल पूल कनेक्शन के लिए कैश करेगा।
  • maxAdministrativeTaskTime: पैरामीटर जो कार्य थ्रेड की इंटरप्ट () विधि को कॉल को मजबूर करता है यदि कोई कार्य निर्धारित समय सीमा से अधिक है

पहले तीन पैरामीटर मान सेट के आधार पर प्रदर्शन को बेहतर या कम कर सकते हैं, जहां आगे पैरामीटर सेट सीमा के बाद थ्रेड को बाधित कर सकता है और अन्य थ्रेड पर जाने के लिए परिवर्तन दे सकता है।

अनुमानित मूल्य

  • numHelperThreads = 6
  • maxStatements = 100
  • maxStatementsPerConnection = 12
  • maxAdministrativeTaskTime = पर्याप्त समय की आवश्यकता है ताकि भारी क्वेरी उत्पादन पर चल सके

अधिकतम पैरामीटर और maxStatementsPerConnection का परीक्षण कुछ महीनों के लिए किया जाना चाहिए क्योंकि इन पैरामीटर की वजह से मृत लॉक पर कुछ पोस्टिंग पॉइंट।

इन लिंक का जिक्र भी उपयोगी होगा;


यह कनेक्टर / जे का एक पुराना संस्करण है। यह सुनिश्चित करने के लिए कि आप एक ज्ञात और निश्चित बग से जूझ नहीं रहे हैं, मैं नवीनतम (5.0.8) प्राप्त करके शुरू करूंगा:

http://dev.mysql.com/downloads/connector/j/5.0.html

EOFException से वह EOFException थोड़ा संदिग्ध है। सामान्य / गैर-बग्गी उपयोग के तहत, आपको उस परत से कभी भी त्रुटियां नहीं मिलनी चाहिए।


Hibernate.c3p0.idle_test_periods को h * ibernate.c3p0.timeout * से कम होना चाहिए क्योंकि पहला केवल एक समय मान है जहां निष्क्रिय कनेक्शन के लिए हाइबरनेट जांच करें और इसे बंद करने का प्रयास करें।

इस बीच दूसरा यह है कि कनेक्शन को निकालने के लिए कितना समय लगता है।

यदि idle_test_periods हाइबरनेट की तुलना में टाइमआउट पैरामीटर से बड़ा है जो शून्य में मौजूद है या सिस्टम में मौजूद नहीं है। कम से कम मैं इस तरह से समझ गया।







c3p0