2008-10-01 8 views
7

से अधिक हो गया निम्न कोड एक साधारण सम्मिलन आदेश निष्पादित करता है। यदि इसे लगातार 2,000 बार कहा जाता है (2,000 पंक्तियों को सम्मिलित करने के लिए) संदेश के साथ एक ओलेडीबीएक्सप्शन = "सिस्टम संसाधनों से अधिक" फेंक दिया जाता है। क्या संसाधनों को मुक्त करने के लिए मुझे कुछ और करना चाहिए?OleDbException सिस्टम संसाधन

using (OleDbConnection conn = new OleDbConnection(connectionString)) 
using (OleDbCommand cmd = new OleDbCommand(commandText, conn)) 
{ 
    conn.Open(); 
    cmd.ExecuteNonQuery(); 
} 

उत्तर

5

सिस्टम संसाधनों को पार कर त्रुटि (जेट?)

आप कई कनेक्शन, तेजी से करने के लिए रास्ता के लिए रास्ता खोल रहे हैं प्रबंधित कोड से नहीं आ रही है, इसकी आप से आ रही अपने डेटाबेस की मौत हो गई ...

कुछ युक्तियां:

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

क्या आपने यह कोशिश की है?

using (OleDBConnection conn = new OleDBConnection(connstr)) 
{ 
    while (IHaveData) 
    { 
     using (OldDBCommand cmd = new OldDBCommand()) 
     { 
      cmd.Connection = conn; 
      cmd.ExecuteScalar(); 
     } 
    } 
} 
+0

मैं ने वही समस्या थी, और लूप न केवल अपवाद से छुटकारा मिला के बाहर 'का उपयोग कर()' बयान चलती है, लेकिन तेजी से गति में वृद्धि हुई। धन्यवाद। –

1

मैंने बिना किसी अपवाद के एक एक्सेस 2007 डेटाबेस के साथ इस कोड का परीक्षण किया (मैं 13000 आवेषण के रूप में उच्च चला गया)।

हालांकि, मैंने जो देखा वह यह है कि यह हर बार कनेक्शन बनाते समय बहुत धीमी है। यदि आप लूप के बाहर "उपयोग (कनेक्शन)" डालते हैं, तो यह बहुत तेज हो जाता है।

0

उपरोक्त के अलावा (केवल एक बार डेटाबेस से कनेक्ट), मैं यह भी सुनिश्चित करना चाहता हूं कि आप अपने कनेक्शन बंद कर रहे हैं और निपटान कर रहे हैं। चूंकि सी # में अधिकांश ऑब्जेक्ट्स प्रबंधित wrt मेमोरी हैं, कनेक्शन और स्ट्रीम में यह लक्जरी हमेशा नहीं होता है, इसलिए यदि इस तरह की ऑब्जेक्ट्स का निपटारा नहीं किया जाता है, तो उन्हें साफ़ करने की गारंटी नहीं है। इस कार्यक्रम को आपके कार्यक्रम के जीवन के लिए खुला छोड़ने का अतिरिक्त प्रभाव है।

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

+0

"उपयोग" कमांड –

0

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

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

+0

बनाए गए कनेक्शनों का निपटारा करता है क्या आपके पास इसका बैक अप लेने का स्रोत है? – Ian

+0

मुझे अपने स्रोत याद नहीं हैं, यह लंबे समय तक रहा है। लेकिन नेट के कई स्थानों पर मुझे कई टिप्पणियां मिली हैं कि यह मुद्दा मौजूद है। क्षमा करें मेरे पास और जानकारी नहीं है। – Krucible

-1

ऐसा इसलिए हो सकता है क्योंकि आप कनेक्शन और कमांड ऑब्जेक्ट का निर्माण नहीं कर रहे हैं। हमेशा अंत में वस्तु का निपटान करें।

OledbCommand.Dispose(); 
+1

"उपयोग" स्कोप से बचने के बाद ऑब्जेक्ट का निपटारा किया जाएगा। इस तरह "उपयोग" काम करता है – MikkaRin

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