hibernate - कनेक्शन पूल खाली सीतनिद्रा में होना 4, लेकिन अपराधी को खोजने में असमर्थ




tomcat transactions (3)

मैं प्रत्येक 5 मिनट में कनेक्शन के लिए SQL डेटाबेस की निगरानी कर रहा हूं। दिनों के लिए यह लगभग 5 कनेक्शन (मेरे बेकार) के आसपास घुमाएगा, तब अचानक मैं 50 पर हूँ। जाहिर है यह एक पुनरावर्ती मुद्दा है क्योंकि मुझे नहीं पता कि मैं 5 मिनट के भीतर 5 से 50 के बीच शून्य ट्रैफिक के साथ क्यों जाऊँगा।

मैं सीतनिद्रा में होना 4 और टोमकट का उपयोग कर रहा हूं और मुझे हाइबरनेट में एक समस्या का पता चल रहा है जिसे 4.3.2 में पैच किया गया था, लेकिन मैं 4.3.5 पर हूँ

अधिक विवरण: पूल रिक्त घटना हर दिन बिल्कुल 7:13:20 अपराह्न पर होती है ... बहुत स्वचालित लगता है। मैं क्वार्ट्ज का उपयोग कर रहा हूं और यह हर 1 मिनट में चलता है, लेकिन मुझे नहीं पता कि वे कैसे संबंधित हैं।

मेरे गुण:

jmxEnabled = true
initialSize = 5
maxActive = 50
minIdle = 5
maxIdle = 25
maxWait = 10000
maxAge = 10 * 60000
timeBetweenEvictionRunsMillis = 5000
minEvictableIdleTimeMillis = 60000
validationQuery = "SELECT 1"
validationQueryTimeout = 3
validationInterval = 15000
testOnBorrow = true
testWhileIdle = true
testOnReturn = false
jdbcInterceptors = "ConnectionState"
defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_COMMITTED

वातावरण:

  • बिलाव 7.0.59
  • जावा 1.7.0 अपडेट 76
  • SQL सर्वर 2012

अधिक जानकारी: मैंने प्रत्येक 5 मिनट में क्वार्ट्ज नौकरी की आवृत्ति कम कर दी। जब भी मैंने एक पेज / दृश्य को आवेदन में लोड किया था, तब भी यह घटना हुई। यह मोटे तौर पर 7:14 बजे था। मैं हाइबरनेट के लिए डाउनग्रेड करने की कगार पर हूँ 3

अपडेट आज मैं 6:50 बजे टॉमकेट मैनेजर में आवेदन को पुनः लोड कर दिया, लेकिन घटना अभी भी हुई। थ्रेड डंप


आह उन तरह की बग मजेदार हैं जाहिर है वहाँ कोई रास्ता नहीं है कि हम आपको सटीक अपराध की ओर इशारा कर सकते हैं (सिवाय जब कोई आपके द्वारा उल्लिखित लिब्ज़ में कोई बग खोदता है), तो देखते हैं कि आप इसे कैसे डिबग कर सकते हैं अनुमान से आसान करने के लिए मुश्किल से, हालांकि विवरण आपके पर्यावरण पर निर्भर करता है।

  1. आपके पास बहुत उपयोगी जानकारी है: समस्या हमेशा एक ही समय में होती है यह दो विकल्प इंगित करता है: या तो कोई भी आपकी नौकरी जो आप क्वार्ट्ज के साथ चलते हैं, कनेक्शन को खाता होती है, या कुछ (संभावित बाहरी) उस समय हो रहा है जिससे आपका कोड कनेक्शन को खाने में मदद करता है जाहिर है आपको अपनी नौकरी कॉन्फ़िगरेशन और क्रॉन जॉब्स या जॉब्स को डेटाबेस के भीतर कॉन्फ़िगर किया जाना चाहिए या संभावित अपराधियों के समान। ध्यान दें कि वे कुछ समय पहले शुरू कर सकते हैं और बाद में उस महत्वपूर्ण स्थिति पर पहुंच सकते हैं, इसलिए नौकरी पहले 2hours शुरू हो सकता है हम सभी जानते हैं।

  2. अपने लॉग्स और सिस्टम लॉग्स और डेटाबेस लॉग्स उस समय या कुछ समय पहले होने वाली किसी भी चीज़ की जांच करें।

  3. अगर वह हमेशा कनेक्शन लौटाता है, तो प्रत्येक कनेक्शन को दो बार जांचें खासकर जब अपवाद फेंका जाए उसमें एक असफल होने का शास्त्रीय तरीका इस तरह एक निर्माण है (छद्म कोड जैसे जावा):

    Connection con;
    
    try {
        con = getConnection();
        Statement = stmnt = con.createStatement();
        ....
    } finally (Exception ex){
        if (stmnt != null) stmnt.close();
        if (con != null) con.close(); // this will never happen if stmnt.close throws an exceptions
    
    }
  4. लॉगिंग की स्थापना करें, जिससे आप यह देख सकें कि जब कनेक्शन वापस नहीं मिलता। जो कुछ भी आपके आवेदन में कुछ भी शुरू करता है वह किसी प्रकार के आवरण के माध्यम से जाना चाहिए (पहलू के आसपास एओपी, सर्वलेट फ़िल्टर या समान)। उस आवरण को निम्न कार्य करना चाहिए: क्रिया (यूयूआईडी) के लिए एक अद्वितीय आईडी बनाएं और अपने लॉगिंग ढांचे के एमडीसी में डाल दें। उस एक्शन के अंत में जो आईडी को फिर से हटा दिया जाता है अन्य सभी लॉगिंग में उस आईडी को शामिल करना चाहिए आप कनेक्शन पूल भी लपेटें जब कोई कनेक्शन का अनुरोध करता है, तो टाइमस्टैम्प, आईडी और संभवत: स्टैकट्र्रेस (एक अपवाद बनाकर और संग्रहीत करके) पर नज़र रखें। लॉग इन करें हर बार जब कोई कनेक्शन वापस लौटा जाता है तो उस समय का इस्तेमाल किया जाता था। हर बार एक कनेक्शन की जांच का अनुरोध किया जाता है कि क्या कोई कनेक्शन लंबे समय तक उपयोग किया जाता है तो कुछ सीमाएं।

  5. चीजों को अलग करें: दूसरा सर्वर सेट करें, जहां आप एप्लिकेशन चलाते हैं। क्या यह एक ही समस्या है? कुछ हिस्सों को केवल दो सर्वरों में से एक पर चलाएं, क्या उनके पास अभी भी समस्या है? केवल एक छोड़े जाने तक उम्मीदवारों को बाहर करना जारी रखें


यदि मुझे इस तरह के एक मुद्दे का सामना करना पड़ता है, तो मैक्सएक्टिव कनेक्शन 50 पर पहुंचने पर मैं एक धागा डंप लेने की कोशिश करूँगा। आप यह अधिकतम जांच करने की कोशिश कर सकते हैं कि क्या आवेदन उच्च शिखर पर है या नहीं।

मैं एक कनेक्शन पूल प्रदाता जैसे c3p0 का उपयोग करने के लिए कॉन्मैटर भी करेगा, अगर यह पहले से उपयोग नहीं किया हुआ है तब मैं एक कस्टम हुक वर्ग बनाऊंगा जैसा कि निम्न अनुभाग में वर्णित है: http://www.mchange.com/projects/c3p0/#connection_customizers

इस कस्टम वर्ग के साथ कनेक्शनों का अधिग्रहण और जारी होने के चलते काउंटर रखें। जब यह संख्या सीमा के निकट या निकट होती है, तो एक थ्रेड डंप को प्रोग्रामेटिक रूप से आरंभ करें। यह निम्न पृष्ठ में बताए अनुसार किया जा सकता है: http://crunchify.com/how-to-generate-java-thread-dump-programmatically/ कनेक्शन के स्रोत की जांच करने के लिए इस थ्रेड डंप का विश्लेषण करें।

यह जानकारी न केवल आपके वर्तमान मुद्दे के लिए बल्कि भविष्य के प्रदर्शन समस्याओं के निवारण के लिए भी उपयोगी होगी।


मैं पहले अपने उत्तरों का योगदान करने के लिए सभी को धन्यवाद देना चाहता हूं। @जन्सस्चौडर की तरह मैंने सुझाव दिया था कि मैं इस समस्या को अलग करने की कोशिश कर रहा हूं मुझे आश्चर्य है कि मुझे क्यूए में समस्या क्यों नहीं मिली, लेकिन उत्पादन में ऐसा किया।

यद्यपि मैंने अपने नेटवर्क ऑपरेशंस टीम के साथ पालन किया, तब तक कोई भी उस पर हिट नहीं हुआ जब तक कि आखिरकार मेरे पास लॉग की आवश्यकता हो।

हम स्कैन और सुरक्षा कमजोरियों को स्कैन करने के लिए अलर्ट लॉजिक नामक एक उत्पाद का उपयोग करते हैं, लेकिन दुर्भाग्यवश यह अपराधी होने की खोज नहीं हुई जब तक कि मैं अपाचे एक्सेस लॉग को किसी आईपी पते पर नहीं खोज सके। whois ने एक रैकस्पेस होस्ट से अलर्ट लॉजिक सॉफ़्टवेयर से उत्पन्न आईपी की पहचान की।

अनुप्रयोग सर्वर नया था और इसमें एक नई आर्किटेक्चर छवि शामिल थी। यह पता चला है कि चेतावनी तर्क एक भेद्यता पर मार रहा था। इसके बाद एक कनेक्शन पूल खाली हो गया (बेलिंग?)

मध्य सप्ताह तक, मुझे नहीं पता था कि अलर्ट लॉजिक समीकरण में भी था। वास्तव में, अब, मैं नेटवर्क ऑपरेशंस के साथ काम कर रहा हूं क्योंकि उत्पाद समाप्त होने के बाद से यह बेहतर है।

बाद में इस हफ्ते, मैं क्यूए में जबकि भेद्यता के निष्कर्षों को प्रकाशित करूँगा (पचिंग उत्पादन प्राथमिकता के बाद से)





connection-pooling