2009-01-24 12 views
42

मैं माइस्क्लुएल 5.1.30 के साथ एक साथ हाइबरनेट का उपयोग करता हूं।डेडलॉक्स से बचने के लिए हाइबरनेट के लिए आवश्यक सी 3 पी 0 सेटिंग्स क्या हैं

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

मैं जावा 1.5.0_09 और बिल्ला 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 सही तरीके से कैसे सेटअप कर सकता हूं?

+1

स्पष्ट रूप से, आपको अपनी संयम बोल्ट को हटाने की आवश्यकता है। –

+0

मुझे लगता है कि प्रत्येक एप्लिकेशन को अपना स्वयं का एप्लिकेशन पूल मिलता है क्योंकि मेरे पास तीन hibernate.cfg.xml फ़ाइलें हैं जैसे एप्लिकेशन के वेब-आईएनएफ/कक्षा फ़ोल्डर में पोस्ट की गई। –

+1

क्या उनके पास एक ही जेएनडीआई नाम है? यदि ऐसा है, तो वे उसी पूल से कनेक्शन देखने के लिए टोमकैट से पूछ रहे हैं। प्रत्येक परियोजना के लिए आपको एक अलग पूल रखने के लिए अलग जेएनडीआई नाम की आवश्यकता है। आपको टॉमकैट एडमिन टूल में 3 जेएनडीआई पूल देखना चाहिए। अगर मैं सही हूं, तो आप केवल एक ही देखेंगे। – duffymo

उत्तर

0

क्या तीन एप्लिकेशन समान कनेक्शन पूल साझा करते हैं, या क्या प्रत्येक को अपना स्वयं का मिलता है? मैं बाद वाले की सिफारिश करता हूँ।

+0

मुझे लगता है कि प्रत्येक एप्लिकेशन को अपना स्वयं का एप्लिकेशन पूल मिलता है क्योंकि मेरे पास तीन hibernate.cfg.xml फ़ाइलें हैं जैसे एप्लिकेशन के वेब-आईएनएफ/कक्षा फ़ोल्डर में पोस्ट की गई। –

8

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

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

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

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

लगभग मूल्यों

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

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

इसके अलावा इन कड़ियों की चर्चा करते हुए उपयोगी होगा;

1

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

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

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

42

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

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

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

मुझे आशा है कि यह सहायक हो सकता है।

3

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

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

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

-1
<property name="hibernate.c3p0.timeout">300</property>  
    <property name="hibernate.c3p0.idle_test_periods">3000</property>  

idle_test_period मान समय के बराबर मूल्य से कम होना चाहिए।

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