दिलचस्प पोस्ट
एसक्यूएल में सिंगल और डबल कोट्स में क्या फर्क है? JQuery में हर 5 सेकंड फ़ंक्शन को कॉल करने का सबसे आसान तरीका क्या है? मैं HTML5 / जावास्क्रिप्ट का उपयोग कर कनेक्शन प्रकार (वाईफाई / लैन / WWAN) कैसे देखूं? यादृच्छिक, अद्वितीय मान पैदा करना सी # बूलियन चर जावास्क्रिप्ट समारोह से स्ट्रिंग के रूप में देता है ओरेकल में दोहरी तालिका क्या है? क्या इनपुट प्रकार = "दिनांक" प्रारूप को बदलने का कोई तरीका है? पायथन प्राइम नंबर चेकर क्या एंड्रॉइड पीयर-टू-पीयर एड-हॉक नेटवर्किंग कर सकता है? D3js – क्षैतिज पट्टी चार्ट में कार्यक्षेत्र बार चार्ट बदलें मैं एक प्रोटोटाइप फ़ंक्शन में "यह" के लिए एक नया मान क्यों नहीं दे सकता? क्या यह मैन्युअल रूप से बंद करने और SqlDataReader के निपटान के लिए आवश्यक है? डुप्लिकेट इंडेक्सेस के साथ पंक्तियों को निकालें (पांडस डेटाफ़्रेम और टाइम सिरीज़) IOS 7 मल्टीटास्किंग स्विचर में स्क्रीनशॉट को नियंत्रित करना संकेतक का उपयोग क्यों करें?

java.sql.SQLException: – ORA-01000: अधिकतम खुले कर्सर पार हो गए हैं

मुझे ओआरए -01000 एसक्यूएल अपवाद प्राप्त हो रहा है। इसलिए मुझे इसके बारे में कुछ प्रश्न हैं।

  1. क्या अधिकतम खुले कर्सर ठीक से जेडीबीसी कनेक्शन की संख्या से संबंधित हैं, या वे एक कथन के लिए बनाई गई कथन और परिणामसेट वस्तुओं से भी संबंधित हैं? (हम कनेक्शन के पूल का उपयोग कर रहे हैं)
  2. डेटाबेस में बयान / परिणामों की संख्या की संख्या को कॉन्फ़िगर करने का एक तरीका है (जैसे कनेक्शन)?
  3. क्या यह विधि स्थानीय कथन / resultset ऑब्जेक्ट के बजाय एक थ्रेडेड वातावरण में उदाहरण चर स्टेटमेंट / परिणामसेट ऑब्जेक्ट का उपयोग करने योग्य है?
  4. क्या लूप में एक तैयार कथन निष्पादित करता है जो इस समस्या का कारण बनता है? (बेशक, मैं sqlbatch का इस्तेमाल कर सकता था) नोट: लूप समाप्त हो जाने पर pStmt बंद हो गया है।

    { //method try starts String sql = "INSERT into TblName (col1, col2) VALUES(?, ?)"; pStmt = obj.getConnection().prepareStatement(sql); pStmt.setLong(1, subscriberID); for (String language : additionalLangs) { pStmt.setInt(2, Integer.parseInt(language)); pStmt.execute(); } } //method/try ends { //finally starts pStmt.close() } //finally ends 
  5. यदि conn.createStatement () और conn.prepareStatement (sql) एकल कनेक्शन ऑब्जेक्ट पर कई बार कहा जाता है तो क्या होगा?

संपादित करें 1: 6. क्या कमजोर / नरम संदर्भ कथन का प्रयोग रिसाव को रोकने में मदद करेगा?

संपादित करें 2: 1. क्या कोई तरीका है, मैं अपनी प्रोजेक्ट में सभी गुम "statement.close ()" प्राप्त कर सकता हूं? मैं समझता हूं कि यह स्मृति रिसाव नहीं है लेकिन मुझे कथन संग्रह के लिए योग्य (जहां करीब () नहीं किया गया है) एक बयान संदर्भ खोजने की आवश्यकता है? कोई भी उपकरण उपलब्ध है? या मुझे मैन्युअल रूप से इसका विश्लेषण करना है?

कृपया इसे समझने में मेरी मदद करें

उपाय

उपयोगकर्ता नाम के लिए ओरेकल डीबी में खोले गए कर्सर को खोजने के लिए -VELU

मशीन को ORALCE पर जाएं और sqlplus को sysdba के रूप में प्रारंभ करें।

 [oracle@db01 ~]$ sqlplus / as sysdba 

तो भागो

 SELECT A.VALUE, S.USERNAME, S.SID, S.SERIAL# FROM V$SESSTAT A, V$STATNAME B, V$SESSION S WHERE A.STATISTIC# = B.STATISTIC# AND S.SID = A.SID AND B.NAME = 'opened cursors current' AND USERNAME = 'VELU'; 

यदि संभव हो तो कृपया मेरे उत्तर को अंत में पढ़ें।

वेब के समाधान से एकत्रित समाधान "java.sql.SQLException: – ORA-01000: अधिकतम खुले कर्सर पार हो गए हैं"

Ora-01000, अधिकतम-ओपन कर्सर त्रुटि, ओरेकल डाटाबेस विकास में एक बहुत ही सामान्य त्रुटि है। जावा के संदर्भ में, ऐसा तब होता है जब अनुप्रयोग एक अधिकतर ResultSets खोलने का प्रयास करता है, इससे डेटाबेस इंस्टॉलेशन पर कर्सर को कॉन्फ़िगर किया जाता है।

सामान्य कारण हैं:

  1. कॉन्फ़िगरेशन गलती

    • आपके पास डीबी पर कर्सर की तुलना में डेटाबेस को क्वेरी करने के आपके पास अधिक थ्रेड्स हैं। एक मामले में आपका कनेक्शन और थ्रेड पूल डेटाबेस पर कर्सर की संख्या से बड़ा होता है।
    • आपके पास कई डेवलपर्स या एक ही डीबी उदाहरण (जो शायद कई स्कीमा शामिल होंगे) से जुड़े अनुप्रयोग हैं और एक साथ आप बहुत अधिक कनेक्शन का उपयोग कर रहे हैं
    • उपाय:

      • डेटाबेस पर कर्सर की संख्या बढ़ाना (संसाधनों की अनुमति दें) या
      • आवेदन में थ्रेड्स की संख्या में कमी।
  2. कर्सर रिसाव

    • अनुप्रयोग ResultSets बंद नहीं कर रहा है (JDBC में) या कर्सर (डेटाबेस पर संग्रहीत कार्यविधियों में)
    • समाधान : कर्सर लीक कीड़े हैं; डीबी पर कर्सर की संख्या में वृद्धि के कारण अपरिहार्य असफलता में देरी होती है लीक को स्थिर कोड विश्लेषण , जेडीबीसी या एप्लिकेशन-स्तरीय लॉगिंग और डेटाबेस निगरानी का उपयोग करके पाया जा सकता है।

पृष्ठभूमि

यह खंड कर्सर के पीछे के कुछ सिद्धांत का वर्णन करता है और कैसे जेडीबीसी इस्तेमाल किया जाना चाहिए। यदि आपको पृष्ठभूमि को जानने की जरूरत नहीं है, तो आप इसे छोड़ सकते हैं और सीधे 'एलिमिनेटिंग लीक' पर जा सकते हैं।

एक कर्सर क्या है?

एक कर्सर डेटाबेस पर एक संसाधन होता है जिसमें एक क्वेरी की स्थिति होती है, विशेष रूप से वह स्थिति जहां पाठक एक परिणामस्वरूप में होता है। प्रत्येक चयन कथन में एक कर्सर है, और पीएल / एसक्यूएल संग्रहित प्रक्रियाओं को खोलने और उपयोग करने के लिए कई कर्सर के रूप में उपयोग कर सकते हैं। आप कर्सर के बारे में और अधिक जानकारी प्राप्त कर सकते हैं।

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

कर्सर की संख्या ढूँढना और सेट करना

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

 ALTER SYSTEM SET OPEN_CURSORS=1337 SID='*' SCOPE=BOTH; 

डीबी पर कर्सर के लिए JVM में जेडीबीसी से संबंधित

नीचे दी गई जेडीबीसी वस्तुओं को निम्न डेटाबेस अवधारणाओं के साथ कसकर जोड़ दिया गया है:

  • जेडीबीसी कनेक्शन एक डेटाबेस सत्र का क्लाइंट प्रतिनिधित्व है और डेटाबेस लेनदेन प्रदान करता है। एक कनेक्शन में किसी एक समय में केवल एक ही लेनदेन खुला हो सकता है (लेकिन लेनदेन को नेस्ट किया जा सकता है)
  • एक जेडीबीसी परिणामस्वरूप डेटाबेस पर एक एकल कर्सर द्वारा समर्थित है। जब ResultSet पर बंद () कहा जाता है, कर्सर जारी किया जाता है।
  • एक जेडीबीसी कॉलबल स्टेटैटेट डाटाबेस पर संग्रहीत कार्यविधि का आह्वान करती है, जिसे अक्सर पीएल / एसक्यूएल में लिखा जाता है। संग्रहीत कार्यविधि शून्य या अधिक कर्सर बना सकती है, और एक कर्सर JDBC ResultSet के रूप में वापस कर सकती है।

जेडीबीसी धागा सुरक्षित है: धागे के बीच विभिन्न जेडीबीसी वस्तुओं को पारित करने के लिए काफी ठीक है।

उदाहरण के लिए, आप एक थ्रेड में कनेक्शन बना सकते हैं; एक और धागे तैयार कनेक्शन तैयार करने के लिए इस कनेक्शन का उपयोग कर सकता है और एक तीसरा धागा परिणाम सेट को संसाधित कर सकता है। एकल प्रमुख प्रतिबंध यह है कि आपके पास एक से अधिक ResultSet एक भी तैयार किए गए स्तर पर किसी भी समय खुला नहीं हो सकता है। क्या ओरेकल डीबी का समर्थन प्रति कनेक्शन एकाधिक (समानांतर) कार्यों को देखता है?

ध्यान दें कि एक डेटाबेस प्रतिबद्ध एक कनेक्शन पर होता है, और इसलिए उस कनेक्शन पर सभी डीएमएल (INSERT, UPDATE और DELETE) एक साथ प्रतिबद्ध होंगे। इसलिए, यदि आप एक ही समय में कई लेनदेन का समर्थन करना चाहते हैं, तो आपके पास प्रत्येक समवर्ती लेनदेन के लिए कम से कम एक कनेक्शन होना चाहिए।

जेडीबीसी वस्तुओं को बंद करना

एक परिणामस्वरूप निष्पादित करने का एक विशिष्ट उदाहरण है:

 Statement stmt = conn.createStatement(); try { ResultSet rs = stmt.executeQuery( "SELECT FULL_NAME FROM EMP" ); try { while ( rs.next() ) { System.out.println( "Name: " + rs.getString("FULL_NAME") ); } } finally { try { rs.close(); } catch (Exception ignore) { } } } finally { try { stmt.close(); } catch (Exception ignore) { } } 

ध्यान दें कि आखिरकार क्लोज किसी भी अपवाद को बंद () द्वारा उठाए जाने पर ध्यान नहीं देता:

  • यदि आप try {} catch {} के बिना ResultSet को बंद कर देते हैं, तो यह असफल हो सकता है और स्टेटमेंट बंद होने से रोक सकता है
  • हम फोन करने वाले को प्रचार करने की कोशिश के शरीर में उठाए गए किसी भी अपवाद की अनुमति देना चाहते हैं। यदि आपके पास लूप है, उदाहरण के लिए, विवरण बनाने और कार्यान्वित करने के लिए, प्रत्येक वक्तव्य को लूप के भीतर बंद करना याद रखें।

जावा 7 में, ऑरेकल ने स्वत: क्लोज़ेबल इंटरफेस पेश किया है जो जावा 6 बॉयलरप्लेट के कुछ बेहतरीन वाक्यविन्यास चीनी के साथ बदलता है।

होल्डिंग जेडीबीसी वस्तुओं

जेडीबीसी वस्तुओं को स्थानीय चर, ऑब्जेक्ट इन्सेंटेशन और क्लास सदस्यों में सुरक्षित रूप से रखा जा सकता है। यह आम तौर पर बेहतर अभ्यास है:

  • जेडीबीसी ऑब्जेक्ट धारण करने के लिए ऑब्जेक्ट इन्सेंटेशन या क्लास सदस्यों का उपयोग करें, जो लंबी अवधि में कई बार पुन: उपयोग किए गए हैं, जैसे कि कनेक्शन और तैयार किए गए स्टेटमेंट्स
  • ResultSets के लिए स्थानीय चर का उपयोग करें, क्योंकि ये प्राप्त किए जाते हैं, पर looped और फिर सामान्य रूप से एक समारोह के दायरे के भीतर बंद कर दिया।

हालांकि, एक अपवाद है: यदि आप ईजेबी, या एक सर्विस / जेएसपी कंटेनर का उपयोग कर रहे हैं, तो आपको सख्त थ्रेडिंग मॉडल का पालन करना होगा:

  • केवल अनुप्रयोग सर्वर धागे बनाता है (जिसके साथ वह आने वाले अनुरोधों को संभालता है)
  • केवल अनुप्रयोग सर्वर कनेक्शन बनाता है (जो आप कनेक्शन पूल से प्राप्त करते हैं)
  • कॉल के बीच मूल्य (राज्य) को सहेजते समय, आपको बहुत सावधान रहना होगा। अपने कैश या स्थिर सदस्यों में मूल्यों को कभी भी स्टोर न करें – यह क्लस्टर और अन्य अजीब स्थितियों में सुरक्षित नहीं है, और एप्लिकेशन सर्वर आपके डेटा में भयानक काम कर सकता है। इसके बजाय राज्यपूर्ण सेम या डेटाबेस का उपयोग करें
  • विशेष रूप से, विभिन्न दूरस्थ चालानों पर कभी भी जेडीबीसी ऑब्जेक्ट्स (कनेक्शन्स, रिसेट्ससेट्स, प्रिपेड स्टेटमेंट्स, आदि) को पकड़ नहीं सकते हैं – एप्लिकेशन सर्वर इस का प्रबंधन करते हैं। अनुप्रयोग सर्वर न केवल एक कनेक्शन पूल प्रदान करता है, यह आपके तैयार किए गए स्थितियों को भी कैश करता है।

लीक को खत्म करना

जेडीबीसी लीक का पता लगाने और नष्ट करने में सहायता के लिए कई प्रक्रियाएं और उपकरण उपलब्ध हैं:

  1. विकास के दौरान – बग पकड़ना शुरुआती सबसे अच्छा तरीका है:

    1. विकास प्रथाएं: डेवलपर की डेस्क छोड़ने से पहले अच्छे विकास प्रथाओं को आपके सॉफ़्टवेयर में बग की संख्या को कम करना चाहिए। विशिष्ट प्रथाओं में शामिल हैं:

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

  2. चलने के समय पर:

    1. होल्डबिलिटी और कमिट

      1. यदि ResultSet होल्डबिलिटी ResultSet.CLOSE_CURSORS_OVER_COMMIT है, तो ResultSet बंद है जब Connection.commit () विधि कहा जाता है। यह Connection.setHoldability () या अतिभारित कनेक्शन का उपयोग करके सेट किया जा सकता है .createStatement () विधि
    2. रनटाइम पर लॉगिंग

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

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

अन्य विचार

क्या आप कनेक्शन बंद करने के लिए कमजोर संदर्भ का उपयोग कर सकते हैं?

कमजोर और नरम संदर्भ आप किसी ऑब्जेक्ट को ऐसे तरीके से संदर्भित करने की अनुमति देने के तरीके हैं जो कि जेवीएम को कचरा को किसी भी समय दिये जाने पर कंट्रोल को इकट्ठा करने की अनुमति देता है (मानते हुए कि उस ऑब्जेक्ट के लिए कोई मजबूत संदर्भ श्रृंखला नहीं है)।

यदि आप नरम या कमजोर संदर्भ के लिए कन्स्ट्रक्टर में संदर्भ प्रश्न पास करते हैं, तो ऑब्जेक्ट को संदर्भक्यूयूई में रखा जाता है जब ऑब्जेक्ट GC'ed होता है (जब यह बिल्कुल होता है)। इस दृष्टिकोण के साथ, आप ऑब्जेक्ट के अंतिम रूप से बातचीत कर सकते हैं और आप उस पल में ऑब्जेक्ट को बंद या अंतिम रूप दे सकते हैं।

प्रेत का संदर्भ थोड़ा सा है; उनका उद्देश्य केवल अंतिम रूप से नियंत्रित करने के लिए है, लेकिन आप मूल ऑब्जेक्ट का कोई संदर्भ कभी नहीं प्राप्त कर सकते हैं, इसलिए इसे बंद करने के तरीके () को कॉल करना कठिन होगा।

हालांकि, जीसी चलने पर नियंत्रित करने का प्रयास करना शायद ही कभी एक अच्छा विचार है (कमजोर, शीतल और फेंटम के संदर्भों से आपको यह पता चला है कि ऑब्जेक्ट जीसी के लिए एनक्यूटेड है)। वास्तव में, यदि JVM में मेमोरी की मात्रा बड़ी है (उदाहरण के लिए- Xmx2000m) तो आप ऑब्जेक्ट जीसी कभी नहीं कर सकते हैं, और आप अभी भी ORA-01000 अनुभव करेंगे। यदि JVM मेमोरी आपके प्रोग्राम की अपेक्षाओं के सापेक्ष छोटा है, तो आप पाएंगे कि ResultSet और PreparedStatement ऑब्जेक्ट्स सृजन के तुरंत बाद GCed (इससे पहले कि आप उनसे पढ़ सकते हैं), जो संभवत: आपके प्रोग्राम को विफल हो जाएगा।

टीएल; डीआर: कमजोर संदर्भ तंत्र, कथन और परिणामस्वरूप वस्तुओं को प्रबंधित और बंद करने का एक अच्छा तरीका नहीं है।

मैं कुछ और समझ जोड़ रहा हूं

  1. कर्सर केवल एक बयान objecct के बारे में है; यह न तो नतीजा है न ही कनेक्शन ऑब्जेक्ट।
  2. लेकिन फिर भी हमें कुछ ओरेकल मेमोरी को मुक्त करने के लिए resultset को बंद करना होगा। फिर भी अगर आप परिणामस्वरूप बंद नहीं करते हैं जो कूर्सर्स के लिए गिना नहीं जाएगा।
  3. समापन वक्तव्य ऑब्जेक्ट स्वतः ही resultet ऑब्जेक्ट को बंद कर देगा
  4. कर्सर सभी का चयन / प्रविष्ट / अद्यतन / डेली स्टेटमेंट के लिए बनाया जाएगा।
  5. प्रत्येक ऑरेकल डीबी उदाहरण को ओरेकल एसआईडी के द्वारा पहचाना जा सकता है; इसी तरह ओरेकल डीबी कनेक्शन एसआईडी का उपयोग करके प्रत्येक कनेक्शन की पहचान कर सकता है। दोनों एसआईडी अलग हैं
  6. तो ओरेकल सत्र केवल एक जेडीबीसी (टीसीपी) कनेक्शन नहीं है; जो कुछ भी नहीं बल्कि एक एसआईडी है
  7. यदि हम अधिकतम कर्सर को 500 के रूप में सेट करते हैं तो यह केवल एक जेडीबीसी सत्र / कनेक्शन / एसआईडी के लिए है।
  8. इसलिए हमारे पास कई जेडीबीसी कनेक्शन कर्सर (बयान) से संबंधित नहीं हो सकते हैं।
  9. एक बार जब जेवीएम को समाप्त कर दिया जाता है तो सभी कनेक्शन / कर्सर बंद हो जाएंगे, या उस कनेक्शन के संबंध में जेडीबीसीसी कनेक्शन बंद हो जाएगा।

Sysdba के रूप में Loggin

पोटीटी में (ओरेकल लॉगिन):

  [oracle@db01 ~]$ sqlplus / as sysdba 

एसक्लप्लस में:

sys as sysdba : sys as sysdba

Session_cached_cursors मूल्य को 0 पर सेट करें ताकि यह कर्सर को बंद न करें।

  alter session set session_cached_cursors=0 select * from V$PARAMETER where name='session_cached_cursors' 

वर्तमान OPEN_CURSORS वाउज डीबी में प्रति कनेक्शन सेट करें

  SELECT max(a.value) as highest_open_cur, p.value as max_open_cur FROM v$sesstat a, v$statname b, v$parameter p WHERE a.statistic# = b.statistic# AND b.name = 'opened cursors current' AND p.name= 'open_cursors' GROUP BY p.value; 

नीचे खुली कर्सर मूल्यों के साथ एसआईडी / कनेक्शन सूची को खोजने के लिए क्वेरी है।

  SELECT a.value, s.username, s.sid, s.serial# FROM v$sesstat a, v$statname b, v$session s WHERE a.statistic# = b.statistic# AND s.sid=a.sid AND b.name = 'opened cursors current' AND username = 'SCHEMA_NAME_IN_CAPS' 

खुले कर्सर में एसक्यूएल की पहचान करने के लिए निम्न क्वेरी का उपयोग करें

  SELECT oc.sql_text, s.sid FROM v$open_cursor oc, v$session s WHERE OC.sid = S.sid AND s.sid=1604 AND OC.USER_NAME ='SCHEMA_NAME_IN_CAPS' 

अब कोड को डिबग करें और आनंद लें !!! 🙂

इस तरह अपने कोड को सही करें:

 try { //method try starts String sql = "INSERT into TblName (col1, col2) VALUES(?, ?)"; pStmt = obj.getConnection().prepareStatement(sql); pStmt.setLong(1, subscriberID); for (String language : additionalLangs) { pStmt.setInt(2, Integer.parseInt(language)); pStmt.execute(); } } //method/try ends finally { //finally starts pStmt.close() } 

क्या आप वाकई, आप वास्तव में अपने pStatements, कनेक्शन और परिणाम बंद कर रहे हैं?

ओपन ऑब्जेक्ट्स का विश्लेषण करने के लिए आप एक प्रतिनिधि प्रतिनिधि पैटर्न लगा सकते हैं, जो अपने राज्यमित्र, कनेक्शन और परिणाम ऑब्जेक्ट्स के आसपास कोड लपेटता है। तो आप देखेंगे, यदि कोई ऑब्जेक्ट सफलतापूर्वक बंद हो जाएगा।

उदाहरण के लिए: pStmt = obj getConnection ()। प्रीपेरेस्टेटमेंट (एसक्यूएल);

  class obj{ public Connection getConnection(){ return new ConnectionDelegator(...here create your connection object and put it into ...); } } class ConnectionDelegator implements Connection{ Connection delegates; public ConnectionDelegator(Connection con){ this.delegates = con; } public Statement prepareStatement(String sql){ return delegates.prepareStatement(sql); } public void close(){ try{ delegates.close(); }finally{ log.debug(delegates.toString() + " was closed"); } } } 

यदि आपका एप्लिकेशन ओरेकल वेबलोगिक पर अनुप्रयोग सर्वर के रूप में चलाने वाला जावा ईई अनुप्रयोग है, तो इस समस्या का संभावित कारण WebLogic में स्टेटमेंट कैश आकार सेटिंग है

यदि किसी विशेष डेटा स्रोत के लिए स्टेटमेंट कैश साइज सेटिंग ओरेकल डाटाबेस की अधिकतम खुली कर्सर गिनती की समानता के बराबर है, या इसके बाद के संस्करण, तो सभी खुले कर्सर कैश किए गए एसक्यूएल स्टेटमेंट्स द्वारा उपयोग किए जा सकते हैं जो कि वेबलोगिक द्वारा खुले हैं, परिणामस्वरूप ORA-01000 त्रुटि में

इसका समाधान करने के लिए, प्रत्येक WebLogic डेटा स्रोत के लिए स्टेटमेंट कैश साइज सेटिंग कम करें जो कि ओरेकल डेटाबेस को डेटाबेस पर अधिकतम कर्सर गिनती सेटिंग से काफी कम है।

वेबलॉगिक 10 एडमिन कंसोल में प्रत्येक डेटा स्रोत के लिए स्टेटमेंट कैश साइज सेटिंग सेवाएं (बाएं एनएवी)> डेटा स्रोत> (व्यक्तिगत डेटा स्रोत)> कनेक्शन पूल टैब पर मिल सकती है।

क्या आपने autocommit = सच निर्धारित किया? अगर यह कोशिश न करें:

 { //method try starts String sql = "INSERT into TblName (col1, col2) VALUES(?, ?)"; Connection conn = obj.getConnection() pStmt = conn.prepareStatement(sql); for (String language : additionalLangs) { pStmt.setLong(1, subscriberID); pStmt.setInt(2, Integer.parseInt(language)); pStmt.execute(); conn.commit(); } } //method/try ends { //finally starts pStmt.close() } //finally ends 

एसक्यूएल खोलने के लिए क्वेरी

 SELECT s.machine, oc.user_name, oc.sql_text, count(1) FROM v$open_cursor oc, v$session s WHERE oc.sid = s.sid and S.USERNAME='XXXX' GROUP BY user_name, sql_text, machine HAVING COUNT(1) > 2 ORDER BY count(1) DESC 

आज मुझे उसी समस्या का सामना करना पड़ा (ओआरए -01000) ओरेकल डीबी में कई बार (प्रत्येक बार एक पैरामीटर बदल रहा है) में एक चयन कथन को निष्पादित करने के लिए मैंने कोशिश {} में लूप के लिए किया था, और अंत में {} मेरे पास हमेशा के रूप में Resultset, PreparedStatement और कनेक्शन बंद करने के लिए मेरा कोड था । लेकिन जैसे ही मैं एक विशिष्ट मात्रा में छोरों (1000) तक पहुंचता हूं, मुझे बहुत सारे खुले कर्सर के बारे में ओरेकल त्रुटि मिली।

उपरोक्त एंड्रयू एलकॉक द्वारा दिए गए पद के आधार पर, मैंने परिवर्तन किए, ताकि पाश के अंदर , मैंने प्रत्येक परिणाम और प्रत्येक वक्तव्य को डेटा प्राप्त करने के बाद बंद कर दिया और फिर दोबारा लूप करने से पहले, और इस समस्या का समाधान किया।

इसके अतिरिक्त, एक ही समस्या एक अन्य ऑरेकल डीबी (ओआरए -01000) में, सम्मिलित स्टेटमेंट के दूसरे लूप में हुई, इस बार 300 स्टेटमेंट के बाद। फिर इसे उसी तरह हल किया गया था, इसलिए या तो तैयार किए गए अवस्था या परिणामस्वरूप या दोनों, खुले कर्सर के रूप में गिना, जब तक कि वे बंद न हों।

मुझे भी इस मुद्दे का सामना करना पड़ा था। नीचे दिए गए अपवाद आने वाले थे

 java.sql.SQLException: - ORA-01000: maximum open cursors exceeded 

मैं स्प्रिंग फ़्रेमवर्क स्प्रिंग जेडीबीसी के साथ दाओ परत के लिए इस्तेमाल कर रहा था।

मेरा आवेदन किसी तरह कर्सर को छीनने के लिए इस्तेमाल किया गया था और कुछ ही मिनटों के बाद, यह मुझे यह अपवाद देने के लिए इस्तेमाल किया गया था

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

मेरा आवेदन उन कॉलमों को अपडेट करने का प्रयास कर रहा था, जिन्हें गलती से अनुक्रमित किया गया था । इसलिए, जब भी मेरा अनुक्रमित अनुक्रमित कॉलम पर अपडेट क्वेरी को मार रहा था, तो डेटाबेस अद्यतन मानों के आधार पर पुन: प्रक्षेपण करने का प्रयास कर रहा था। यह कर्सर लीक कर रहा था

मैं कॉलम पर उचित इंडेक्सिंग करके समस्या को हल करने में सक्षम था जिसका इस्तेमाल क्वेरी में खोजने और जहां भी आवश्यक हो वहां उपयुक्त बाधाओं को लागू करने के लिए किया जाता था।

बैच प्रसंस्करण का उपयोग कम उपरि में होगा। उदाहरण के लिए निम्नलिखित लिंक देखें: http://www.tutorialspoint.com/jdbc/jdbc-batch-processing.htm

हमारे मामले में, हम हाइबरनेट का उपयोग कर रहे थे और हमारे पास एक ही हाइबरनेट मैप इकाई को संदर्भित करने वाले कई चर थे। हम इन संदर्भों को एक लूप में बनाते और सहेज रहे थे। प्रत्येक संदर्भ ने एक कर्सर खोला और उसे खोल दिया।

हमने एक कोड का उपयोग करते हुए खुले कर्सर की संख्या की जांच करने के लिए एक क्वेरी का उपयोग करके इसकी खोज की है, डीबगर के माध्यम से कदम बढ़ाते हुए और चीजों को चुनौतीपूर्ण रूप से टिप्पणी करने के लिए।

प्रत्येक नए संदर्भ में एक और कर्सर क्यों खुलता है – सवाल में इकाई में उसमें मैप किए गए अन्य संस्थाओं के संग्रह होते हैं और मुझे लगता है कि इसके साथ कुछ ऐसा होता है (शायद न केवल यह अकेला है, लेकिन संयोजन के साथ हमने फैच मोड को कैसे कॉन्फ़िगर किया था और कैश सेटिंग्स) हाइबरनेट के पास खुदा कर्सर को बंद करने में असफल रहने के आसपास बग्स हैं , हालांकि ऐसा लगता है कि इन्हें बाद के संस्करणों में तय किया गया है।

चूंकि हम वास्तव में वही इकाई के लिए इतने सारे डुप्लिकेट संदर्भों की ज़रूरत नहीं थी, इसलिए समाधान उन सभी अनावश्यक संदर्भों को बनाने और बनाने पर रोक देना था। एक बार जब हमने उस समस्या को दूर किया

यह समस्या मुख्य रूप से तब होती है जब आप कनेक्शन पूलिंग का उपयोग कर रहे हैं क्योंकि जब आप कनेक्शन बंद करते हैं, तो कनेक्शन कनेक्शन पूल पर वापस जाते हैं और उस कनेक्शन से जुड़े सभी कर्सर कभी बंद नहीं होते क्योंकि डेटाबेस के कनेक्शन अब भी खुले हैं। तो एक विकल्प पूल में कनेक्शन के निष्क्रिय कनेक्शन के समय को कम करना है, इसलिए जब भी कनेक्शन 10 सेकंड के लिए कनेक्शन में बेकार बैठता है, तो डेटाबेस से कनेक्शन बंद हो जाएगा और पूल में डाल करने के लिए नया कनेक्शन बनाया जाएगा।

ओरेकल 10 जी से कनेक्ट होने पर, मैं WildFly और Tomcat में मेरे डेटा स्रोत के साथ इस समस्या थी।

मैंने पाया कि कुछ शर्तों के तहत वक्तव्य बंद नहीं किया गया था, जब भी वक्तव्य। समस्या ओरेकल चालक के साथ थी जो हम प्रयोग कर रहे थे: ojdbc7.jar। यह ड्राइवर ओरेकल 12c और 11g के लिए लक्षित है, और ऐसा लगता है कि जब ओरेकल 10 जी के साथ प्रयोग किया जाता है, तो मैं ओजडबीसी 5.जर पर डाउनग्रेड और अब सब कुछ ठीक चल रहा है।

मुझे एक ही समस्या का सामना करना पड़ा क्योंकि मैं 1000 से अधिक पुनरावृत्तियों के लिए डीबी पूछताछ कर रहा था। मैंने कोशिश की है और आखिर में अपने कोड में। लेकिन अभी भी त्रुटि हो रही है

इसे हल करने के लिए मैं सिर्फ ऑरेकल डीबी में लॉग ऑन हूं और क्वेरी से नीचे चला गया है:

वैकल्पिक सिस्टम सेट open_cursors = 8000 SCOPE = दोनों;

और इसने मेरी समस्या को तुरंत हल किया