8

हमारे पास सी # में कोडित एक वेब सेवा है जो एमएस एसक्यूएल सर्वर 2005 डेटाबेस को कई कॉल करता है। कोड सी # के कनेक्शन पूलिंग के साथ संयुक्त ब्लॉक का उपयोग करता है।सी # कनेक्शन पूलिंग के लिए इतने सारे sp_resetconnections क्यों?

एसक्यूएल ट्रेस के दौरान, हमने कई लोगों को "sp_resetconnection" में देखा। इनमें से अधिकतर < 0.5 सेकंड हैं, हालांकि कभी-कभी हमें 9 सेकंड तक चलने वाली कॉल मिलती है।

जो मैंने पढ़ा है उससे sp_resetconnection कनेक्शन पूलिंग से संबंधित है और मूल रूप से एक खुले कनेक्शन की स्थिति को रीसेट करता है। मेरे प्रश्न:

  • एक खुले कनेक्शन को अपने राज्य रीसेट की आवश्यकता क्यों है?
  • इन कॉलों में से इतने सारे क्यों!
  • गैर-मामूली समय लेने के लिए sp_reset कनेक्शन को कॉल करने का क्या कारण हो सकता है।

यह मेरे लिए काफी रहस्य है, और मैं किसी भी और सभी मदद की सराहना करता हूं!

+0

यदि आपके पास एक प्रोफाइलर ट्रेस है जो sp_reset_connetion को लंबे समय तक दिखाता है, तो आप क्लाइंट के कॉल से पहले क्या काम करते हैं? इससे आपको यह पता होना चाहिए कि कॉल के दौरान किस राज्य को फेंक दिया जा रहा है। – ahains

+0

संभावित डुप्लिकेट [sp \ _reset \ _connection क्या करता है?] (Http://stackoverflow.com/questions/596365/what-does-sp-reset-connection-do) –

उत्तर

12

रीसेट बस चीजों को रीसेट करता है ताकि आपको रीसेट करने के लिए रीकनेक्ट न करें। यह एसईटी या यूएसई ऑपरेशंस जैसी चीजों के कनेक्शन को साफ करता है ताकि प्रत्येक क्वेरी में एक साफ स्लेट हो।

कनेक्शन अभी भी पुन: उपयोग किया जा रहा है।यहाँ एक extensive list है:

sp_reset_connection एक कनेक्शन के निम्नलिखित पहलुओं को रीसेट करता है:

  • यह (@@ त्रुटि की तरह) सभी त्रुटि राज्यों और संख्या को रीसेट करता है
  • यह सब चुनाव आयोग के (निष्पादन संदर्भों) बंद हो जाता है कि एक समानांतर क्वेरी
  • निष्पादित करने वाले अभिभावक ईसी के बाल धागे हैं 0 बजे
  • यह किसी भी बकाया I/O संचालन के लिए इंतजार करेगा, यह सर्वर बी पर किसी भी बफर को मुक्त करेगा y कनेक्शन
  • यह किसी भी बफर संसाधन है कि कनेक्शन द्वारा उपयोग किया जाता अनलॉक हो जाएगा
  • यह सब स्मृति कनेक्शन के स्वामित्व में आवंटित जारी करेंगे
  • यह किसी भी काम या अस्थायी तालिकाओं कनेक्शन द्वारा बनाई गई हैं कि साफ हो जाएगा
  • यह सब वैश्विक कनेक्शन
  • के स्वामित्व कर्सर मार डालेगा यह किसी भी खुला एसक्यूएल-एक्सएमएल हैंडल खुला
  • यह किसी भी खुला एसक्यूएल-एक्सएमएल से संबंधित काम तालिकाओं को नष्ट करेगा कर रहे हैं बंद हो जाएगा
  • यह सब प्रणाली टा बंद हो जाएगा bles
  • यह सब उपयोगकर्ता टेबल बंद हो जाएगा
  • यह सब अस्थायी वस्तुओं छोड़ देंगे
  • यह खुले लेनदेन को रद्द कर देगा
  • यह जब लोग भर्ती हुए
  • यह उपयोगकर्ताओं के लिए संदर्भ गिनती घटती होगा एक वितरित लेन-देन से दोष होगा वर्तमान डेटाबेस में; जो डेटाबेस
  • ताला यह अधिग्रहण ताले
  • यह विज्ञप्ति किसी भी हैंडल का अधिग्रहण किया गया हो सकता है
  • यह डिफ़ॉल्ट मानों के लिए पूरी तरह से तैयार विकल्पों को रीसेट जाएगा
  • यह @@ rowcount मान रीसेट होगा मुक्त होगा साझा रिलीज
  • यह @@ पहचान मूल्य
  • रीसेट कर देगा यह उपयोग कर किसी भी सत्र के स्तर का पता लगाने के लिए विकल्पों को रीसेट कर देगा DBCC TRACEON()

sp_reset_connection रीसेट नहीं होगा:

  • सुरक्षा संदर्भ है, जिसके कारण कनेक्शन पूलिंग मिलान सटीक कनेक्शन स्ट्रिंग
  • यदि आप sp_setapprole का उपयोग कर एक आवेदन भूमिका है, क्योंकि आवेदन भूमिकाओं
  • वापस नहीं लाई जा सकती है में प्रवेश किया के आधार पर कनेक्शन
  • लेनदेन अलगाव स्तर (!)
1

यहाँ, What does sp_reset_connection do? का एक विवरण है जो कहता है भाग में "ODBC, OLE-DB की तरह डेटा एक्सेस एपीआई परतों और SqlClient (आंतरिक) सेंट फोन एक कनेक्शन पूल से कनेक्शन का दोबारा उपयोग करते समय ored प्रक्रिया sp_reset_connection। यह फिर से उपयोग होने से पहले कनेक्शन की स्थिति को रीसेट करने के लिए करता है। "फिर यह कुछ स्पष्टीकरण देता है कि वह सिस्टम स्पोक क्या करता है। यह एक अच्छी बात है।

1

sp_resetconnection प्रत्येक बार पूल से नए कनेक्शन का अनुरोध करने के लिए बुलाया जाएगा। यह ऐसा करना है क्योंकि पूल उपयोगकर्ता की गारंटी नहीं दे सकता है (आप, प्रोग्रामर शायद :) ने उचित स्थिति में कनेक्शन छोड़ा है। जैसे असामान्य लेनदेन के साथ एक पुराना कनेक्शन लौटना होगा .. बाड।

कॉल के एनआरआर नए कनेक्शन लाने के समय से संबंधित होना चाहिए।

कुछ कॉलों के लिए गैर-तुच्छ समय लेने के लिए, मुझे यकीन नहीं है। सर्वर उस समय अन्य सामानों को संसाधित करने में बहुत व्यस्त हो सकता है। नेटवर्क देरी हो सकती है।

1

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

ऐसा होने पर आप कितने कुल कनेक्शन चल रहे हैं?

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

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

यदि आप कनेक्शन पूलिंग बंद करते हैं तो क्या होता है?