c# - SQLite/सी#कनेक्शन पूलिंग और तैयार वक्तव्य भ्रम




prepared-statement connection-pooling (2)

मुझे बिल्कुल सही समस्या नहीं थी, लेकिन समस्या यह है कि इतनी कम समय में एक लेनदेन में थोक सम्मिलन विवरण कैसे डालें।

यहां एक सहायक वर्ग है जो मैंने पहले पाया था जो आपकी मदद कर सकता है:

SQLiteBulkInsertHelper.cs

आप इसे इस तरह इस्तेमाल कर सकते हैं:

SQLiteBulkInsertHelper ContactBlk = new SQLiteBulkInsertHelper("<SQLiteConnection>","<Table Name>");
ContactBlk.AllowBulkInsert = true;
ContactBlk.AddParameter("<Column Name>", /*Column Data Type*/System.Data.DbType.Int64);
ContactBlk.AddParameter("<Column Name>", /*Column Data Type*/System.Data.DbType.String);
ContactBlk.Insert(new object[] {<First Column Value>,<Second Column Value>});
ContactBlk.Flush();

अगर आप इसे अपनी समस्या के समाधान के रूप में देखते हैं तो इसे आज़माएं।

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

मेरा भ्रम विशेष रूप से तैयार बयान और कनेक्शन पूलिंग से उत्पन्न होता है।

http://msdn.microsoft.com/en-us/library/ms971481.aspx पढ़ने के दौरान मैंने पाया कि कनेक्शन केवल लेनदेन के लिए खोले जाने चाहिए। लेनदेन पूरा होने के बाद कनेक्शन बंद होना चाहिए। मुझे इस बात का कोई फर्क नहीं पड़ता कि यह क्यों मामला है, लेकिन मैं इस धारणा से काम कर रहा हूं कि लेखक (ओं) बेहतर जानते हैं। मैं समझता हूं कि जब कनेक्शन बंद हो जाता है तो इसका मतलब यह नहीं है कि यह वास्तव में है बंद कर दिया गया इसका मतलब यह है कि इसे पूल में वापस रखा गया है।

अब मेरे प्रश्नों और आवेषणों को बेहतर बनाने के लिए मैंने तैयार बयानों का उपयोग करने के बारे में पढ़ा है। SQLite में, तैयार कथन वास्तव में प्रदर्शन में सुधार करते हैं? और http://petesbloggerama.blogspot.com/2007/02/sqlite-adonet-prepared-statements.html दोनों यह इंगित करते हैं कि एक क्वेरी निष्पादित करते समय जो कई बार तैयार किए गए बयान किए जाने का तरीका है। मैंने यह भी पढ़ा है कि एक तैयार कथन कनेक्शन के लिए विशिष्ट है और एक बार जब कनेक्शन बंद हो जाता है तो तैयार कथन खो जाता है।

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

मेरा भ्रम इस तथ्य से उत्साहित है कि मेरा मानना ​​है कि एक तैयार कथन मेरे SQLiteCommand ऑब्जेक्ट के दायरे से जुड़ा हुआ है।

यदि मैं एक SQLiteCommand बनाता हूं जो एक क्वेरी का प्रतिनिधित्व करता है जिसे मैं अक्सर निष्पादित कर दूंगा, तो मुझे सक्रिय रहने के लिए तैयार कथन के लिए स्मृति में उस SQLiteCommand को याद रखने की आवश्यकता है?

यदि मैं एक ही SQLiteCommand को एक ही SQLite कथन के साथ बनाता हूं, तो क्या यह मान्यता प्राप्त है कि नया SQLiteCommand पिछले जैसा ही है और इस प्रकार एक तैयार कथन है जिसका उपयोग किया जा सकता है?

अगर मैं स्मृति में SQLiteCommand रखता हूं और इसके पैरामीटर और कनेक्शन को बदलता हूं क्योंकि मैं अलग-अलग लेनदेन के लिए कनेक्शन खोलता हूं और बंद करता हूं, क्या मैं अनिवार्य रूप से विभिन्न कनेक्शनों के बीच एक तैयार कथन को जीवित रखता हूं?

मैं इस बिंदु पर चीजों को सोचने की सबसे अधिक संभावना रखता हूं लेकिन मुझे उम्मीद है कि आप मेरी समझ में मदद कर सकते हैं कि ये बातें कैसे बातचीत करती हैं ताकि मैं उनमें से सबसे अधिक लाभ प्राप्त कर सकूं।


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

कनेक्शन पूलिंग का उपयोग करने के संभावित कारण

कनेक्टेड पूलिंग उपयोगी होती है जब कनेक्शन महंगे होते हैं, उदाहरण के लिए:

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

तैयार वक्तव्यों का उपयोग करने के संभावित कारण

तैयार बयान केवल पार्सिंग समय को काटकर पुनः उपयोग करने योग्य प्रश्नों के प्रदर्शन में सुधार के लिए हैं।

SQLite: सर्वश्रेष्ठ विकल्प क्या है?

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

यदि प्रदर्शन महत्वपूर्ण है, तो आपको यह देखने के लिए निश्चित रूप से एप्लिकेशन को प्रोफ़ाइल करना चाहिए कि SQLite कनेक्शन पूलिंग आपके परिदृश्य के लिए फायदेमंद है या नहीं।

विशिष्ट प्रश्न

अधिकांश उत्तर वर्तमान System.Data.SQLite से संबंधित हैं। System.Data.SQLiteSystem.Data.SQLite प्रदाता source

अगर मैं अपना कनेक्शन खोल रहा हूं और बंद कर रहा हूं (जो थ्रेड पूल के कारण कनेक्शन बंद हो रहा है या नहीं हो सकता है) तो मैं वास्तव में तैयार कथन से कितना उपयोग कर रहा हूं?

आम तौर पर, आपको पूल के बाहर आने वाले कनेक्शन का इलाज करना चाहिए, यानी आपको पहले तैयार किए गए बयान से कोई लाभ नहीं मिलने चाहिए। कथन "पुनः तैयार" होगा जबतक कि आप कमांड और कनेक्शन दोनों को न रखें।

हालांकि मुझे विश्वास नहीं है कि लेनदेन में एक वस्तु को सहेजने से मुझे लाभ दिखाई देगा क्योंकि एक बार जब मैं कनेक्शन बंद कर देता हूं तो पहले ऑब्जेक्ट से उत्पन्न तैयार कथन अब खो गया है। क्या यह एक सच्चा बयान है?

यह एक सच्चा बयान है।

यदि मैं एक SQLiteCommand बनाता हूं जो एक क्वेरी का प्रतिनिधित्व करता है जिसे मैं अक्सर निष्पादित कर दूंगा, तो मुझे सक्रिय रहने के लिए तैयार कथन के लिए स्मृति में उस SQLiteCommand को याद रखने की आवश्यकता है?

हां, आपको इसे रखने की जरूरत है। SQLiteCommand तैयार कथन का संदर्भ रखता है।

यदि मैं एक ही SQLiteCommand को एक ही SQLite कथन के साथ बनाता हूं, तो क्या यह मान्यता प्राप्त है कि नया SQLiteCommand पिछले जैसा ही है और इस प्रकार एक तैयार कथन है जिसका उपयोग किया जा सकता है?

मुझे नहीं लगता कि यह समर्थित है।

अगर मैं स्मृति में SQLiteCommand रखता हूं और इसके पैरामीटर और कनेक्शन को बदलता हूं क्योंकि मैं अलग-अलग लेनदेन के लिए कनेक्शन खोलता हूं और बंद करता हूं, क्या मैं अनिवार्य रूप से विभिन्न कनेक्शनों के बीच एक तैयार कथन को जीवित रखता हूं?

यदि आप SQLiteCommand के कनेक्शन को SQLiteCommand , तो कथन "पुनः तैयार" होगा।







connection-pooling