कनेक्शन पूल कनेक्शन को रिसाइकिल करने से पहले sp_resetconnection को कॉल करता है। लेन-देन अलगाव स्तर को रीसेट करना उन चीजों की सूची में नहीं है जो sp_resetconnection करता है। यह समझाएगा कि क्यों "क्रमबद्ध" पूल किए गए कनेक्शनों में लीक हो जाता है।
मुझे लगता है कि आप प्रत्येक क्वेरी को यह सुनिश्चित करके शुरू कर सकते हैं कि यह सही आइसोलेशन स्तर पर है:
if not exists (
select *
from sys.dm_exec_sessions
where session_id = @@SPID
and transaction_isolation_level = 2
)
set transaction isolation level read committed
दूसरा विकल्प:किसी भिन्न कनेक्शन स्ट्रिंग वाले कनेक्शन कनेक्शन पूल साझा नहीं करते हैं। इसलिए यदि आप "क्रमबद्ध करने योग्य" प्रश्नों के लिए किसी अन्य कनेक्शन स्ट्रिंग का उपयोग करते हैं, तो वे "पढ़ने के लिए प्रतिबद्ध" प्रश्नों के साथ एक पूल साझा नहीं करेंगे। कनेक्शन स्ट्रिंग को बदलने का एक आसान तरीका एक अलग लॉगिन का उपयोग करना है। आप Persist Security Info=False;
. जैसे यादृच्छिक विकल्प भी जोड़ सकते हैं ।
अंत में, आप यह सुनिश्चित कर सकते हैं कि प्रत्येक "धारावाहिक" क्वेरी लौटने से पहले अलगाव स्तर को रीसेट कर दे। यदि कोई "क्रमबद्ध करने योग्य" क्वेरी पूरी नहीं हो पाती है, तो आप दूषित कनेक्शन को पूल से बाहर निकालने के लिए कनेक्शन पूल को साफ़ कर सकते हैं:
SqlConnection.ClearPool(yourSqlConnection);
यह संभावित रूप से महंगा है, लेकिन असफल प्रश्न दुर्लभ हैं, इसलिए आपको ClearPool()
पर कॉल करने की आवश्यकता नहीं है अक्सर।