8

मैं Parallel.ForEach उपयोग कर रहा हूँ से अधिक थ्रेड पर काम करने के लिए, प्रत्येक यात्रा के लिए एक नया EF5 DbContext का उपयोग कर, सभी एक TransactionScope भीतर लिपटे "अपने बयान फिर से चलाएँ वहाँ कम सक्रिय उपयोगकर्ता हैं जब", इस प्रकार है:एकाधिक dbcontexts, EntityException

"एसक्यूएल सर्वर डेटाबेस इंजन का उदाहरण एक लॉक संसाधन प्राप्त नहीं कर सकता:

using (var transaction = new TransactionScope()) 
{ 
    int[] supplierIds; 

    using (var appContext = new AppContext()) 
    { 
     supplierIds = appContext.Suppliers.Select(s => s.Id).ToArray(); 
    } 

    Parallel.ForEach(
     supplierIds, 
     supplierId => 
    { 
     using (var appContext = new AppContext()) 
     { 
      Do some work... 

      appContext.SaveChanges();     
     } 
    }); 

    transaction.Complete(); 
} 

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

क्या किसी को पता है कि इसका कारण क्या है या इसे कैसे रोका जा सकता है? धन्यवाद।

+0

आप शायद उत्पन्न कर रहे हैं एक लाख धागे, टीपीएल को छोटे, सीपीयू-बाध्य कार्यों और गैर-सीपीयू-बाध्य कार्यों के लिए ऑप्टिमाइज़ किया गया है ("वहां इतना अतिरिक्त CPU क्यों है ???") और अधिक धागे को बढ़ाने में। एमएसडीएन से सीमित समवर्ती शेड्यूलर का उपयोग करें –

+0

http://msdn.microsoft.com/en-us/library/ee789351.aspx –

+0

मुझे लगता है कि आप सही हैं कि यह कम हो रहा था धागे के विज्ञापन। बीएमडीक्सन द्वारा सुझाए गए समांतरता की डिग्री को सीमित करने से समस्या हल हो गई। –

उत्तर

6

तुम भी new ParallelOptions { MaxDegreeOfParallelism = 8 } का उपयोग कर Parallel.ForEach() विधि में समवर्ती कार्यों की अधिकतम संख्या निर्धारित करने का प्रयास (8 के साथ बदल सकते जो भी आप इसे करने के लिए सीमित करना चाहते हैं।

अधिक जानकारी के लिए MSDN देखें

+0

यह डिफ़ॉल्ट TPL कार्य शेड्यूलर में कुछ भी प्रभावित नहीं करता है। –

+1

@ ta.speot.is सुनिश्चित नहीं है कि आपका क्या मतलब है। समानांतर। फॉरएच() 'संग्रह में प्रत्येक आइटम के लिए एक 'कार्य' नहीं बनाता है, यह 'कार्य' का पुन: उपयोग करता है। और यदि आप 'MaxDegreeOfParallelism' सेट करते हैं, तो यह' कार्य का उपयोग 'और इस प्रकार समानांतरता की वास्तविक डिग्री को सीमित करेगा। – svick

+0

एंटिटी फ्रेमवर्क में समानांतर संचालन में अप्रत्याशित विवादों के साथ एक समस्या प्रतीत होती है। मैंने इस समस्या का भी अनुभव किया है, इस पर भी चर्चा की गई है: http://stackoverflow.com/q/13182603/141172 – xpereta

0

आप SQL सर्वर द्वारा अनुमत ताले की अधिकतम संख्या में चल रहे हैं - जो डिफ़ॉल्ट रूप से स्वचालित रूप से सेट हो जाता है और उपलब्ध स्मृति द्वारा शासित होता है।

आप

  1. सेट इसे मैन्युअल रूप से कर सकते हैं - मैं भूल जाते हैं वास्तव में कैसे लेकिन गूगल अपने दोस्त है।
  2. अपने एसक्यूएल सर्वर
  3. पर अधिक मेमोरी जोड़ें अधिक बार अपने लेनदेन को कम करें।
+0

मेरी अज्ञानता को क्षमा करें लेकिन मुझे समझ में नहीं आता कि प्रक्रिया को कई ताले की आवश्यकता क्यों है? आपके सहयोग के लिए धन्यवाद। –

+0

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

+0

इसके बारे में कुछ और सोचना, इसकी लगभग निश्चित रूप से। एक कनेक्शन के साथ और बहुत सारे आवेषण ताले को आगे बढ़ाएंगे। कई कनेक्शन के साथ, यह ऐसा नहीं कर सकता है। –

1

आपको क्यों पता होना चाहिए आपका ऐप इतनी बड़ी ताले ले रहा है? आपने एकाधिक डीबी कनेक्शन के आसपास एक ट्रांज़ेक्शनस्कोप लपेट लिया है। यह शायद एक वितरित लेनदेन का कारण बनता है जिसे इसके साथ करना पड़ सकता है। यह निश्चित रूप से ताले को बहुत अंत तक जारी नहीं होने का कारण बनता है। उसे बदलो।

आप अभी तक लॉकिंग सीमाएं बदल सकते हैं। यह सप्लायर आईडी के मनमानी मात्रा में पैमाने पर नहीं है। ताले के लिए आपको कारणों की आवश्यकता है, लक्षणों को कम नहीं करें।

+0

दरअसल, मुझे समझ में नहीं आता कि इसे ताले के भार की आवश्यकता क्यों है। –

+1

मेरा संदेह यह है कि आपके पास एक ही समय में 100 से अधिक कनेक्शन चल रहे हैं (आप समझते हैं क्यों?) प्रत्येक में "सामान्य" ताले की ताकत होती है। फिक्स लेनदेन के दायरे को शरीर के समानांतर में स्थानांतरित करना है। परीक्षण उद्देश्यों के लिए इसे हटाने का प्रयास करें। – usr