परिचय
ऐसी स्थितियाँ होती हैं जब अनुप्रयोग डेटाबेस कनेक्शन को लंबे समय तक बनाए रखते हैं। ऐसा लगता है कि यह महत्वपूर्ण नहीं है। हालांकि, अगर यह एप्लिकेशन कई कनेक्शन बनाता है या इस तरह के व्यवहार वाले कई एप्लिकेशन हैं - तो चीजें बदतर होती जा रही हैं।
यह लेख एक ट्यूटोरियल नहीं है। यह इस मुद्दे के संभावित समाधानों का वर्णन करता है। हमेशा की तरह, मुझे कोई वैकल्पिक समाधान सुनकर खुशी होगी।
समाधान
1. एक संग्रहीत कार्यविधि बनाएं जो किसी निश्चित उपयोगकर्ता के सभी कनेक्शन या कनेक्शन को निर्दिष्ट डेटाबेस में बंद कर देता है:
[DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv] का उपयोग करें। [KillConnect] @databasename nvarchar(255), -- डेटाबेस @loginname nvarchar(255)=NULL -- निर्दिष्ट डेटाबेस के लिए लॉगिन विवरणASBEGIN /* डिलीट कनेक्शन और लॉगिन विवरण एक्सेस करें */ NOCOUNT ON करें; सेट ट्रांज़ेक्शन आइसोलेशन लेवल बिना पढ़े पढ़ा; if(@databasename is null) start;THROW 50000, 'एक डेटाबेस निर्दिष्ट नहीं है!', 0; अंत में @dbid int=db_id(@databasename) घोषित करना शुरू करें; if(@dbid is NULL) start;THROW 50000, 'डेटाबेस मौजूद नहीं है!', 0; अंत में अगर @dbid <=4 शुरू होता है;THROW 50000, 'सिस्टम डेटाबेस से कनेक्शन हटाने के लिए मना किया जाता है!', 0; अंत में @query nvarchar (अधिकतम) घोषित करना शुरू करें; @query ='' सेट करें; चयन करें @query=coalesce(@query,',' ) +'kill' +convert(varchar, spid) +'; ' Master..sysprocesses से जहां dbid=db_id(@databasename) और spid<>@@SPID और ([email protected] या @loginname शून्य है); अगर लेन(@query)> 0 start start try exec(@query); अंत प्रयास शुरू करें पकड़ अंत पकड़ अंत अंतENDGOयह संग्रहीत कार्यविधि डेटाबेस के साथ आगे की कार्रवाइयों के लिए डेटाबेस या किसी निश्चित उपयोगकर्ता के सभी कनेक्शनों को मैन्युअल रूप से अक्षम करने में मदद करती है।
2. सभी अटकी हुई प्रक्रियाओं को हटाने के लिए एक संग्रहीत कार्यविधि बनाएँ।
उपयोग [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv]।[KillFullOldConnect]ASBEGIN /* यह उन कनेक्शनों को हटा देता है जिन्हें एक दिन पहले निष्पादित किया गया था। ध्यान! सिस्टम डेटाबेस जैसे मास्टर, टेम्पडब, मॉडल और एमएसडीबी इस प्रक्रिया में भाग नहीं लेते हैं। हालाँकि, यह प्रतिकृति के लिए डेटाबेस वितरण को प्रभावित नहीं करता है। */ खाता चालू करें; सेट ट्रांज़ेक्शन आइसोलेशन लेवल बिना पढ़े पढ़ा; @query nvarchar (अधिकतम) घोषित करें; @query ='' सेट करें; चयन करें @query=coalesce(@query,',' ) +'kill' +convert(varchar, spid) +'; ' Master..sysprocesses से जहां dbid>4 और [last_batch]0 start try exec(@query); अंत प्रयास शुरू करें पकड़ अंत पकड़ अंतENDGO
यह संग्रहीत कार्यविधि उन कनेक्शनों को हटा देती है जो 24 घंटे से अधिक पहले पूर्ण किए गए थे। इसके अलावा, यह प्रक्रिया मुख्य सिस्टम डेटाबेस (मास्टर, tempdb, मॉडल और msdb) को प्रभावित नहीं करती है। यदि आप कनेक्शन अक्षम होने पर डेटाबेस तक पहुंचने का प्रयास करते हैं, तो इस एप्लिकेशन के लिए एक नया कनेक्शन बनाया जाएगा।
अब, एजेंट कार्य में संग्रहीत कार्यविधि को दिन में एक बार चलाना आवश्यक है:
निष्पादित करें [DATABASE_NAME].[srv].[KillFullOldConnect];
अपवादों के लिए संभावित कॉल को संसाधित करने के लिए इस क्वेरी को ट्राइ-कैच ब्लॉक में लपेटना बेहतर होगा।
परिणाम
इस लेख में, मैंने विश्लेषण किया है कि डेटाबेस (सभी या एक निश्चित उपयोगकर्ता) से कनेक्शन बंद करने पर संग्रहीत प्रक्रियाओं को कैसे कार्यान्वित किया जाए और किसी विशेष उदाहरण पर अटकी प्रक्रियाओं को हटाया जाए। इसके अलावा, मैंने एक विशेष उदाहरण पर खोज की है कि दैनिक आधार पर अटकी हुई प्रक्रियाओं को हटाने पर किसी कार्य को स्वचालित रूप से कैसे चलाया जाए। यह सर्वर से 'मृत' कनेक्शन की मात्रा को कम करने की अनुमति देता है। डेटाबेस से सभी कनेक्शनों को हटाने से आप कुछ गुणों को संशोधित कर सकते हैं, साथ ही उस प्रक्रिया को बंद कर सकते हैं जो किसी भी समस्या का कारण बनती है।
संदर्भ:
» sysprocesses
» किल
» db_id
» @@SPID