2013-04-26 10 views
7

मेरे पास एक बहुत ही सरल गणना है जो पत्र मैट्रिस का उत्पादन करता है शायद मैट्रिक्स में सभी शब्द पाता है। शब्द में अक्षर आसन्न कोशिकाएं हैं।अलग-अलग प्रक्रियाओं में चल रहे सी 3 पी में डेडलॉक का पता लगाने और रोकने के लिए कैसे?

for (int i = 0; i < 500; i++) { 
     System.out.println(i); 
     Matrix matrix = new Matrix(4); 
     matrix.scanWordsRandomly(9); 
     matrix.printMatrix(); 
     System.out.println(matrix.getSollSize()); 
     matrix.write_to_db(); 
    } 

यहां स्थायी कोड है।

public void write_to_db() { 
    Session session = null; 
    try { 
     session = HibernateUtil.getSessionFactory().openSession(); 
     session.beginTransaction(); 
     Matrixtr onematrixtr = new Matrixtr(); 
     onematrixtr.setDimension(dimension); 
     onematrixtr.setMatrixstr(this.toString()); 
     onematrixtr.setSolsize(getSollSize()); 
     session.save(onematrixtr); 
     for (Map.Entry<Kelimetr, List<Cell>> sollution : sollutions.entrySet()) { 
      Kelimetr kelimetr = sollution.getKey(); 
      List<Cell> solpath = sollution.getValue(); 
      Solstr onesol = new Solstr(); 
      onesol.setKelimetr(kelimetr); 
      onesol.setMatrixtr(onematrixtr); 
      onesol.setSoltext(solpath.toString().replace("[", "").replace("]", "").replace("true", "").replace("false", "")); 
      session.save(onesol); 
     } 

     session.getTransaction().commit(); 
     session.close(); 

    } 
    catch (HibernateException he) { 
     System.out.println("DB Error : " + he.getMessage()); 
     session.close(); 
    } 
    catch (Exception ex) { 
     System.out.println("General Error : " + ex.getMessage()); 
    } 
} 

यहां हाइबरनेट कॉन्फ़िगरेशन फ़ाइल है।

<?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/kelimegame_db_dev?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=UTF-8</property> 
    <property name="hibernate.connection.username">root</property> 
    <property name="hibernate.connection.password">!.Wlu9RrCA</property> 
    <property name="hibernate.show_sql">false</property> 
    <property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property> 
    <property name="hibernate.format_sql">false</property> 
    <!-- Use the C3P0 connection pool provider --> 
    <property name="hibernate.c3p0.acquire_increment">50</property> 
    <property name="hibernate.c3p0.min_size">10</property> 
    <property name="hibernate.c3p0.max_size">100</property> 
    <property name="hibernate.c3p0.timeout">300</property> 
    <property name="hibernate.c3p0.max_statements">5</property> 
    <property name="hibernate.c3p0.idle_test_period">3000</property> 
    <mapping resource="kelimegame/entity/Progress.hbm.xml"/> 
    <mapping resource="kelimegame/entity/Solstr.hbm.xml"/> 
    <mapping resource="kelimegame/entity/Kelimetr.hbm.xml"/> 
    <mapping resource="kelimegame/entity/User.hbm.xml"/> 
    <mapping resource="kelimegame/entity/Achievement.hbm.xml"/> 
    <mapping resource="kelimegame/entity/Matrixtr.hbm.xml"/> 
    </session-factory> 
</hibernate-configuration> 

सभी संभावित समाधान खोजने के बाद मैं मैट्रिक्स और हाइबरनेट का उपयोग कर समाधान जारी रखता हूं। मैं सी 3 पीओ लाइब्रेरी का भी उपयोग कर रहा हूं। मैं किसी धागे को नहीं बढ़ा रहा हूं। सभी काम एक बहुत ही सरल पुनरावृत्ति तरीके से किया जा रहा है। लेकिन मैं अलग प्रक्रियाओं में जार चला रहा हूं। विभिन्न टर्मिनलों से मैं इस को क्रियान्वित कर रहा हूँ:

java -jar NewDB.jar 

मैं एक गतिरोध के रूप में निम्नानुसार है:

  1. C3PO में इस गतिरोध के बाद से मैं हो सकता है:

    Apr 25, 2013 8:38:05 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run 
    WARNING: com[email protected]7f0c09f9 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! 
    Apr 25, 2013 9:08:23 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run 
    WARNING: com[email protected]7f0c09f9 -- APPARENT DEADLOCK!!! Complete Status: 
        Managed Threads: 3 
        Active Threads: 3 
        Active Tasks: 
         com[email protected]2933f261 
          on thread: C3P0PooledConnectionPoolManager[identityToken->z8kfsx8uibeyqevbbapc|4045cf35]-HelperThread-#1 
         com[email protected]116dd369 
          on thread: C3P0PooledConnectionPoolManager[identityToken->z8kfsx8uibeyqevbbapc|4045cf35]-HelperThread-#0 
         com[email protected]41529b6f 
          on thread: C3P0PooledConnectionPoolManager[identityToken->z8kfsx8uibeyqevbbapc|4045cf35]-HelperThread-#2 
        Pending Tasks: 
         com[email protected]165ab5ea 
         com[email protected]1d5d211d 
         com[email protected]4d2905fa 
    Pool thread stack traces: 
        Thread[C3P0PooledConnectionPoolManager[identityToken->z8kfsx8uibeyqevbbapc|4045cf35]-HelperThread-#1,5,main] 
         com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:662) 
        Thread[C3P0PooledConnectionPoolManager[identityToken->z8kfsx8uibeyqevbbapc|4045cf35]-HelperThread-#0,5,main] 
         com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:662) 
        Thread[C3P0PooledConnectionPoolManager[identityToken->z8kfsx8uibeyqevbbapc|4045cf35]-HelperThread-#2,5,main] 
         com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:662) 
    
    
    Apr 25, 2013 9:41:29 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run 
    WARNING: com[email protected]7f0c09f9 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! 
    Apr 25, 2013 9:55:18 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run 
    WARNING: com[email protected]7f0c09f9 -- APPARENT DEADLOCK!!! Complete Status: 
        Managed Threads: 3 
        Active Threads: 3 
        Active Tasks: 
         com[email protected]5a337b7d 
          on thread: C3P0PooledConnectionPoolManager[identityToken->z8kfsx8uibeyqevbbapc|4045cf35]-HelperThread-#0 
         com[email protected]69f079ce 
          on thread: C3P0PooledConnectionPoolManager[identityToken->z8kfsx8uibeyqevbbapc|4045cf35]-HelperThread-#1 
         com[email protected]2accf9b8 
          on thread: C3P0PooledConnectionPoolManager[identityToken->z8kfsx8uibeyqevbbapc|4045cf35]-HelperThread-#2 
        Pending Tasks: 
         com[email protected]771eb4fb 
         com[email protected]fc07d6 
         com[email protected]2266731b 
         com[email protected]740f0341 
         com.mchange.v2.resourcepool.B[email protected] 
         com[email protected]78e924 
         com[email protected]2123aba 
         com[email protected]7acd8a65 
    Pool thread stack traces: 
        Thread[C3P0PooledConnectionPoolManager[identityToken->z8kfsx8uibeyqevbbapc|4045cf35]-HelperThread-#0,5,main] 
         java.text.NumberFormat.getInstance(NumberFormat.java:769) 
         java.text.NumberFormat.getInstance(NumberFormat.java:393) 
         java.text.MessageFormat.subformat(MessageFormat.java:1262) 
         java.text.MessageFormat.format(MessageFormat.java:860) 
         java.text.Format.format(Format.java:157) 
         java.text.MessageFormat.format(MessageFormat.java:836) 
         com.mysql.jdbc.Messages.getString(Messages.java:106) 
         com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2552) 
         com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3002) 
         com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2991) 
         com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3532) 
         com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:943) 
         com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:4113) 
         com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1308) 
         com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2336) 
         com.mysql.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:2176) 
         com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2158) 
         com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792) 
         com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) 
         sun.reflect.GeneratedConstructorAccessor7.newInstance(Unknown Source) 
         sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
         java.lang.reflect.Constructor.newInstance(Constructor.java:525) 
         com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
         com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381) 
         com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305) 
         com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:134) 
         com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:183) 
         com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:172) 
         com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:188)Killed 
    [email protected]:~/NetBeansProjects/NewDB/dist$ 
    

    मेरा प्रश्न इस प्रकार है अलग-अलग प्रक्रियाओं में प्रोग्राम चला रहा हूं?

  2. क्या मुझे इस प्रक्रिया के अंदर एक प्रक्रिया और एकाधिक धागे का उपयोग करना चाहिए?
  3. इस डेडलॉक का पता लगाने के कारण मैं इसका कारण कैसे समझ सकता हूं? क्या डेडलॉक्स के कारण कई जेवीएम का पता लगाने का कोई तरीका है?
+0

आप भी mcache का उपयोग कर रहे हैं? मैं यहां stacktrace द्वारा बता सकता हूं: * com.mchange.v2.async * – Eugene

+0

आप c3p0 का किस संस्करण का उपयोग कर रहे हैं? – Eugene

+0

c3p0-0.9.2 संस्करण है। – cgon

उत्तर

8

यह एक दिलचस्प है।

आपने दो अलग-अलग अलग डेडलॉक्स प्रकाशित किए हैं। पहला व्यक्ति c3p0 को बंद करने का प्रयास कर रहा है() कनेक्शन, और उन करीबी() संचालन न तो सफल रहे हैं और न ही समय-समय पर अपवाद के साथ विफल रहे हैं। दूसरा वैकल्पिक डेडलॉक कनेक्शन अधिग्रहण के साथ समस्याएं दिखाता है: c3p0 नए कनेक्शन प्राप्त करने का प्रयास कर रहा है, और वे प्रयास न तो सफल रहे हैं और न ही समय-समय पर अपवाद के साथ विफल रहे हैं। तथ्य यह है कि बहुत अलग परिचालन ठंडे होते हैं, यह बताता है कि यह आपके डीबीएमएस के साथ लॉक हो रहा है जो आप कर रहे हैं या किसी भी चीज के तनाव के तहत एक और सामान्य समस्या हो सकती है। आपके डेटाबेस के विरुद्ध कई प्रक्रियाओं को चलाने में कोई समस्या नहीं होनी चाहिए, लेकिन आपको सीमाओं के बारे में जानने की आवश्यकता है।

1) hibernate.c3p0.max_statements = 5 एक बहुत बुरा विचार है, लगभग किसी भी पूल पर और विशेष रूप से इस बड़े पूल पर:

आपकी विन्यास के बारे में कुछ दिलचस्प बातें कर रहे हैं। आपके पास 100 कनेक्शन तक पहुंच गए हैं, और आप केवल उन सभी के बीच कुल 5 वक्तव्यों को कैश करने की इजाजत दे रहे हैं। इससे पूल और डीबीएमएस दोनों पर दबाव हो सकता है, क्योंकि आप लगातार तैयार किए गए स्टेटमेंट्स के माध्यम से मंथन करेंगे और कथन कैश इसके बारे में बहुत सारी बहीखाता रखता है। हो सकता है कि आप 5 कैश किए गए बयान प्रति कनेक्शन पर हों, लेकिन यह आपके द्वारा कॉन्फ़िगर नहीं किया गया है। आपने अपने पूल के लिए वैश्विक अधिकतम सेट किया है। शायद इसके बजाय hibernate.c3p0.maxStatementsPerConnection = 5 आज़माएं? या कम से कम जब तक आप अपने डेडलॉक को हल नहीं करते हैं, तो कथन कैशिंग बंद करने के लिए अधिकतम_स्टेटमेंट्स को शून्य पर सेट करें।देखें http://www.mchange.com/projects/c3p0/#configuring_statement_pooling

2) यदि आप एकाधिक थ्रेड के बजाए कई प्रक्रियाओं में अपनी गणना चला रहे हैं, तो क्या आपको वास्तव में 50 - 100 कनेक्शन रखने के लिए प्रत्येक प्रक्रिया की आवश्यकता है? चीजें अच्छी तरह से ठंडी हो सकती हैं क्योंकि आप बहुत से कनेक्शन के साथ डीबीएमएस पर जोर दे रहे हैं क्योंकि आपकी प्रत्येक प्रक्रिया में से प्रत्येक संसाधन-भारी कनेक्शन प्राप्त करता है। आपको किसी भी प्रक्रिया में अधिक कनेक्शन की आवश्यकता नहीं है, आपके पास क्लाइंट थ्रेड्स उस प्रक्रिया के भीतर एक साथ चल रहे हों। मैं hibernate.c3p0.acquire_increment और शायद hibernate.c3p0.max_size को बहुत छोटे मानों पर सेट करता।

3) यदि आपको वास्तव में उन सभी कनेक्शनों को एक साथ चलने की ज़रूरत है, तो आप कॉन्फ़िगरेशन पैरामीटर numHelperThreads को अपने डिफ़ॉल्ट 3 से अधिक मूल्य में बढ़ाकर अपने पूल की कमजोरता को कम कर सकते हैं। शायद आप numHelperThreads को कुछ होना चाहते हैं आपकी मशीन पर दो बार कोर की संख्या उपलब्ध है। यह देखते हुए कि आप कई प्रक्रियाएं चला रहे हैं, लेकिन आप पाएंगे कि आप अपने सीपीयू को संतृप्त कर रहे हैं, और यह चीजों को ठंडा कर रहा है। तो उसके लिए देखो।

मूल रूप से, अपनी कॉन्फ़िगरेशन को अपडेट करने का प्रयास करें ताकि आप संसाधनों का उपयोग कर रहे हों - फ़ाइल हैंडल, नेटवर्क कनेक्शन, सीपीयू - जितनी संभव हो सके कुशलतापूर्वक और ताकि आप अनावश्यक रूप से पूल/स्टेटमेंट कैश/डीबीएमएस पर अनावश्यक रूप से तनाव नहीं कर रहे हों होने के लिए।

यदि ये सुझाव समस्या का समाधान नहीं करते हैं, तो कृपया अपने पूल की भरण कॉन्फ़िगरेशन पोस्ट करें। c3p0 पूल प्रारंभिकरण पर INFO स्तर पर इसकी कॉन्फ़िगरेशन को डंप करता है।

शुभकामनाएं!

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