2017-05-09 17 views
5

मैंने डैपर का उपयोग करके SQL सर्वर में कुछ डेटा लिखने के लिए कुछ कोड लिखा है। मुझे अन्य काम जारी रखने से पहले इस लेखन को पूरा करने की प्रतीक्षा करने की आवश्यकता नहीं है, इसलिए इस अतुल्यकालिक बनाने के लिए कार्य.रुन() का उपयोग करना चाहते हैं।सी #, डैपर, एसक्यूएल सर्वर और कनेक्शन पूलिंग

मैं (का उपयोग) है अपने सिस्टम के बाकी हिस्सों में इस फोन करने के लिए बयान:

using (IDataAccess ida = new DAL()) 
     { 
      ida.WriteMessageToDB(id, routingKey, msgBody); 
     } 

मेरे DAL स्वचालित रूप से dbConnection.State जाँच जब कथन का उपयोग भाग गया है जाएगा, और उन्हें आसानी से ठीक करने का प्रयास करता है, तो यह है बन्द है। यह किसी भी गैर-एसिंक/टीपीएल चयन कॉल के लिए ठीक काम करता है।

हालांकि, जब मैं एक ही समय में लेखन का भार फेंक, Task.Run() कोड पर गिर रहा था के रूप में संबंध उनमें से कुछ के लिए बंद हो गया - अनिवार्य रूप से मैं कोड के समानांतर प्रकृति राज्य का मतलब है लगता है अन्य कार्यों से बंद किया जा रहा था।

मैंने कनेक्शन खोलने के लिए चेक करके इसे 'तय' किया है। कार्य। Run() कोड के भीतर सेट करें, और ऐसा लगता है कि समस्या हल हो गई है। इसलिए जैसा:

Task.Run(() => 
      { 
       if (dbConnection.State == ConnectionState.Closed) 
       { 
        dbConnection.Open(); 
       } 

       if (dbConnection.State == ConnectionState.Open) 
       { 
        *Dapper SQL String and Execute Commands* 
       } 
      }); 

जब मैं इस के बाद SSMS से SELECT * FROM sys.dm_exec_connections चलाने के लिए, मैं एक बहुत अधिक कनेक्शन देखने। अपेक्षित होना?

अब मैं यह समझ के रूप में:

  • डैप्पर पूलिंग
  • एसक्यूएल सर्वर स्वचालित रूप से कनेक्शन पूलिंग के साथ सौदा करना चाहिए कनेक्शन के साथ सौदा नहीं करता है?

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

अग्रिम धन्यवाद।

+5

सबसे पहले, डैपर कनेक्शन खोल देगा यदि यह पहले से खुला नहीं है। दूसरा, डैपर सिर्फ एडीओ.Net का उपयोग करता है जो कनेक्शन पूल से कनेक्शन का उपयोग करेगा। अंत में डैपर में एसिंक विधियां हैं जिनका उपयोग आप 'टास्क.रुन' के बजाय कर सकते हैं। – juharr

उत्तर

1

धन्यवाद जुहरर - मैंने आपका उत्तर उखाड़ फेंका है।

दूसरों के लिए संदर्भ के लिए, मैं इंतजार समारोह और साफ-सुथरी async बारे में बदल दिया है:

private async Task WriteMessageToDB(Guid id, string tableName, string jsonString) 
    { 
      string sql = *Redacted* 
      await dbConnection.ExecuteScalarAsync<int>(sql, new { ID = id, Body = jsonString }); 
    } 

और फिर फोन करने वाले है कि परिणाम पर नजर रखता है में एक नया कार्य बनाया।

यह लगातार लोड के तहत काम कर रहा है, और अत्यधिक नए कनेक्शन भी नहीं देखे जा रहे हैं।

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