दिलचस्प पोस्ट
जावास्क्रिप्ट का उपयोग करके टेक्स्ट रेंज हाइलाइट करें सी # से सी + + डीएलएल और पीछे से स्ट्रिंग पासिंग – न्यूनतम उदाहरण सुपर फास्ट getimagesize php में एरर, ओवरराइडिंग और जेनेरिक टाइप करें मैं जावा में दो सरणी कैसे जोड़ सकता हूं? स्विफ्ट में एक HTTP अनुरोध कैसे करें? Django स्टार्टअप कोड कहां लगाया जाए? विंडोज फॉर्म में पाठ लेबल में "और" प्रतीक दर्ज करें? scanf getchar फ़ंक्शन छोड़ दिया है कैसे ठीक से jsPDF पुस्तकालय का उपयोग करें Html.fromHtml एंड्रॉइड एन में पदावनत हुआ लक्ष्य प्लेटफार्मों को सूचीबद्ध करने में असमर्थ कृपया सुनिश्चित करें कि एंड्रॉइड एसडीके पथ सही है WPF TabControl – टैब बदलें पर अनलोड रोकना? बश कमांड लाइन और इनपुट सीमा __hash __ () को कार्यान्वित करने का सही और अच्छा तरीका क्या है?

ExecuteReader को एक खुला और उपलब्ध कनेक्शन की आवश्यकता है। कनेक्शन का वर्तमान स्थिति कनेक्ट हो रहा है

जब एमएसएसक्यूएल डाटाबेस से एएसपी.नेट ऑनलाइन से कनेक्ट होने का प्रयास किया जाता है, तो दो या दो से ज्यादा लोगों को एक साथ कनेक्ट होने पर मुझे निम्नलिखित मिलेगा:

ExecuteReader को एक खुला और उपलब्ध कनेक्शन की आवश्यकता है। कनेक्शन का वर्तमान स्थिति कनेक्ट हो रहा है।

साइट मेरे स्थानीय होस्ट सर्वर पर ठीक काम करती है

यह किसी न किसी प्रकार का कोड है।

public Promotion retrievePromotion() { int promotionID = 0; string promotionTitle = ""; string promotionUrl = ""; Promotion promotion = null; SqlOpenConnection(); SqlCommand sql = SqlCommandConnection(); sql.CommandText = "SELECT TOP 1 PromotionID, PromotionTitle, PromotionURL FROM Promotion"; SqlDataReader dr = sql.ExecuteReader(); while (dr.Read()) { promotionID = DB2int(dr["PromotionID"]); promotionTitle = DB2string(dr["PromotionTitle"]); promotionUrl = DB2string(dr["PromotionURL"]); promotion = new Promotion(promotionID, promotionTitle, promotionUrl); } dr.Dispose(); sql.Dispose(); CloseConnection(); return promotion; } 

क्या मुझे पता है कि गलत क्या हो सकता है और मैं इसे कैसे ठीक कर सकता हूं?

संपादित करें: भूलने के लिए नहीं, मेरी कनेक्शन स्ट्रिंग और कनेक्शन दोनों स्थिर हैं। मेरा मानना ​​है कि यह कारण है कृपया सलाह दें।

 public static string conString = ConfigurationManager.ConnectionStrings["dbConnection"].ConnectionString; public static SqlConnection conn = null; 

वेब के समाधान से एकत्रित समाधान "ExecuteReader को एक खुला और उपलब्ध कनेक्शन की आवश्यकता है। कनेक्शन का वर्तमान स्थिति कनेक्ट हो रहा है"

केवल पहली जगह पर टिप्पणी करने के लिए खेद है, लेकिन मैं लगभग हर दिन एक समान टिप्पणी पोस्ट कर रहा हूं क्योंकि बहुत से लोग सोचते हैं कि एडीओ। नेट कार्यक्षमता को डीबी-क्लास (मुझे 10 साल पहले भी) में शामिल करने के लिए स्मार्ट होगा। अधिकतर वे स्थिर / साझा ऑब्जेक्ट्स का उपयोग करने का निर्णय लेते हैं क्योंकि यह किसी भी एक्शन के लिए एक नया ऑब्जेक्ट बनाने की तुलना में तेज़ी से प्रतीत होता है

यह न तो पक्षपात के मामले में और असफल-सुरक्षा के मामले में एक अच्छा विचार है

कनेक्शन-पूल के क्षेत्र पर पट्टा न करें

ADO.NET एडीओ-नेट कनेक्शन-पूल में अंतर्निहित कनेक्शन डीबीएमएस को आंतरिक रूप से प्रबंधित करने का एक अच्छा कारण है:

व्यवहार में, अधिकांश अनुप्रयोग कनेक्शन के लिए केवल एक या कुछ अलग कॉन्फ़िगरेशन का उपयोग करते हैं। इसका मतलब है कि आवेदन निष्पादन के दौरान, कई समान कनेक्शन बार-बार खोले जाएंगे और बंद होंगे। कनेक्शन खोलने की लागत को कम करने के लिए, एडीओ। नेट कनेक्शन पूलिंग नामक एक अनुकूलन तकनीक का उपयोग करता है।

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

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

तो आप कोई प्रदर्शन सुधार प्राप्त नहीं कर रहे हैं, लेकिन विपरीत। यदि निर्दिष्ट अधिकतम पूल आकार (100 डिफ़ॉल्ट है) तक पहुंच गया है, तो आपको अपवाद भी मिलेगा (बहुत सारे खुले कनेक्शन …)। इसलिए यह न केवल प्रदर्शन पर असर डालेगा, बल्कि गंदा त्रुटियों का एक स्रोत भी होगा (और लेन-देन का उपयोग किए बिना) एक डेटा-डंपिंग क्षेत्र।

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

निष्कर्ष :

  • कनेक्शन या फिर किसी भी ADO.NET ऑब्जेक्ट का पुन: उपयोग न करें।
  • उन्हें स्थिर / साझा न करें (VB.NET में)
  • हमेशा बनायें (कनेक्शन के मामले में) खोलें, उपयोग करें, बंद करें और उन्हें निपटाएं जहां आपको उनकी आवश्यकता है (एक विधि में फ़े)
  • निपटान और बंद करने के लिए using-statement उपयोग करें (कनेक्शन के मामले में) implicitely

यह कनेक्शन के लिए न केवल सच है (हालांकि सबसे ज्यादा ध्यान देने योग्य) IDisposable को लागू IDisposable प्रत्येक ऑब्जेक्ट का निपटारा होना चाहिए ( using-statement सबसे आसान), System.Data.SqlClient SQL System.Data.SqlClient नामस्थान में सभी अधिक।

सभी उपरोक्त एक कस्टम डीबी-क्लास के खिलाफ बोलते हैं जो सभी ऑब्जेक्ट्स को कैप्चर करते हैं और पुनः उपयोग करते हैं। यही कारण है कि मैंने इसे कचरे में डालने की टिप्पणी की। यह केवल एक समस्या स्रोत है


संपादित करें : यहां आपकी retrievePromotion प्रचार-विधि का एक संभावित कार्यान्वयन है:

 public Promotion retrievePromotion(int promotionID) { Promotion promo = null; var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MainConnStr"].ConnectionString; using (SqlConnection connection = new SqlConnection(connectionString)) { var queryString = "SELECT PromotionID, PromotionTitle, PromotionURL FROM Promotion WHERE PromotionID=@PromotionID"; using (var da = new SqlDataAdapter(queryString, connection)) { // you could also use a SqlDataReader instead // note that a DataTable does not need to be disposed since it does not implement IDisposable var tblPromotion = new DataTable(); // avoid SQL-Injection da.SelectCommand.Parameters.Add("@PromotionID", SqlDbType.Int); da.SelectCommand.Parameters["@PromotionID"].Value = promotionID; try { connection.Open(); // not necessarily needed in this case because DataAdapter.Fill does it otherwise da.Fill(tblPromotion); if (tblPromotion.Rows.Count != 0) { var promoRow = tblPromotion.Rows[0]; promo = new Promotion() { promotionID = promotionID, promotionTitle = promoRow.Field<String>("PromotionTitle"), promotionUrl = promoRow.Field<String>("PromotionURL") }; } } catch (Exception ex) { // log this exception or throw it up the StackTrace // we do not need a finally-block to close the connection since it will be closed implicitely in an using-statement throw; } } } return promo; }