2008-12-11 14 views
5

मैं अभी तक यह स्पष्ट रूप से कहीं भी नहीं कह पाया है, लेकिन उदाहरणों का एक गुच्छा मैंने पाया है कि मैं क्या कर रहा हूं।क्या कनेक्शन बंद होने पर ODP.net एक रेफ कर्सर बंद करता है?

मेरे पास एक सी # कक्षा है जो ओरेकल डीबी से कनेक्ट करने के लिए ओडीपी.net का उपयोग करती है और पैकेज में एक प्रक्रिया चलाती है।

मेरे पैकेज ने प्रक्रियाओं को संग्रहीत किया है जो रेफ कर्सर आउटपुट पैरामीटर लेते हैं। सभी प्रक्रिया एक विशेष चयन कथन के लिए कर्सर खोलती है।

यदि मैं सीधे इस प्रक्रिया को ओरेकल डीबी पर निष्पादित करता हूं, तो आखिरकार मैं खुली कर्सर त्रुटि की अधिकतम संख्या को दबा दूंगा।

तो मैं सोच रहा था कि क्या ODP.net वास्तव में इस प्रक्रिया को बंद कर देता है जो मेरी प्रक्रिया में खोला गया था?

मैं OracleDataApaper.Fill (डेटासेट) विधि का उपयोग कर रहा हूं।

उदाहरण के लिए।

DataSet ds = new DataSet(); 
OracleConnection conn = new OracleConnection(this.connStr); 
OracleCommand com = new OracleCommand("MYPKG.MYQUERY", conn); 
OracleDataAdapter adapter = new OracleDataAdapter(com); 
conn.Open(); 
com.Parameters.Add("searchParam", OracleDbType.Varchar2).Value = "myName"; 
com.Parameters.Add("outCursor", OracleDbType.RefCursor, ParameterDirection.Output); 
com.CommandType = CommandType.StoredProcedure; 

adapter.Fill(ds); 
conn.Close(); 




PROCEDURE GETALLEMAILS(searchParamIN VARCHAR2, outCursor OUT sys_refcursor) AS 
    BEGIN 
    open outCursor 
     select 
     EAEMAL as Email 
     from 
     EmailTable 
     where 
     EmailName = searchParam; 
    END GETALLEMAILS; 

मैं सिर्फ डीबी पर खुले कर्सर छोड़ने से डरता हूं। अगर कोई आधिकारिक दस्तावेज के लिंक प्रदान कर सकता है, तो यह बहुत अच्छा होगा!


अपडेट:

इनपुट के लिए धन्यवाद। मैं

com.Dispose(); 
conn.Close(); 
conn.Dispose(); 

पर कॉल कर रहा था लेकिन उन्हें मेरे उदाहरण से बाहर छोड़ दिया।

मुझे यह मंच पोस्ट मिला, जिसमें कहा गया है कि भरने() विधि को निष्पादित करने के बाद OracleDataAdapter.Fill (डेटासेट) विधि रेफ कर्सर को रिलीज़ करती है।
http://www.frontoracle.com/oracle-archive/140/386140-close-ref-cursor.html

काश ओरेकल प्रलेखन इस प्रक्रिया का वर्णन हालांकि में अधिक स्पष्ट किया गया था।

उत्तर

9

ओडीपी.नेट आपको चीजों को साफ करने की आवश्यकता है। तो तुम:

  • , OracleParameter उदाहरणों निपटान के लिए है के रूप में वे अप्रबंधित संसाधन होते हैं और Odp.net इस
  • है, OracleCommand वस्तुओं निपटान के लिए के रूप में वे भी अप्रबंधित संसाधनों को शामिल नहीं करता है और एक को बंद करने (!) कनेक्शन इन
  • खुले कर्सर खुले कनेक्शन के बिना नहीं रह सकते हैं, हालांकि कनेक्शन में बंद होने के बाद odp.net को कुछ भी साफ़ नहीं किया जाता है (या निपटान हो जाता है), इसलिए आपको इन्हें भी साफ करना होगा (और इससे पहले कनेक्शन निश्चित रूप से बंद हो जाता है)।

I.o.w .: जो भी आप बनाते हैं उसे साफ़ करें।

यह ओरेकलडाटा एडाप्टर पहले से ही आपके लिए यह कर सकता है, लेकिन यह अस्पष्ट है (और odp.net दस्तावेज़ यह नहीं कहते हैं, इसलिए आपको सुनिश्चित करने के लिए परावर्तक के साथ (अपठनीय) कोड जांचना होगा। हालांकि नियम odp.net के साथ अंगूठे के लिए: स्मृति रिसाव से बचने के लिए, ऑर्डर में सबकुछ पर हमेशा निपटान करें, पैरामीटर, कर्सर, कमांड, लेनदेन, कनेक्शन।

+2

यदि आप उपयोग करते हैं तो ऑब्जेक्ट्स की सूची में ओरेकलडेटा रीडर जोड़ना होगा ऐसा लगता है कि हमारे "अधिकतम खुले कर्सर" समस्या हल हो गई है। – Fueled

0

मुझे यकीन नहीं है कि आप this आलेख पर ठोकर खा चुके हैं, और यह सीधे आपके प्रश्न पर लागू नहीं होता है, लेकिन यह ओडीपी.NET के साथ काम करते समय मैंने जो कुछ सीखा, उसे दिखाता है। जब: संदेह में, हमेशा बंद (कनेक्शन) और निपटान। प्रत्येक विधि जिसे मैं लिखता हूं जो ओडीपी कनेक्शन, कमांड, और/या कर्सर के उदाहरण का उपयोग करता है, आखिर में सब कुछ निपटाने का खंड है।

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