2008-10-19 18 views
77

में खुले/सक्रिय कनेक्शन की कुल संख्या निर्धारित करने के लिए कैसे करें मेरा PHP/एमएस एसक्यूएल सर्वर 2005/जीत 2003 आवेदन कभी-कभी बहुत ही उत्तरदायी हो जाता है, स्मृति/सीपीयू उपयोग स्पाइक नहीं होता है। अगर मैं एसक्यूएल प्रबंधन स्टूडियो से कोई नया कनेक्शन खोलने का प्रयास करता हूं, तो यह सिर्फ खुले कनेक्शन संवाद बॉक्स पर लटकता है। कैसे सक्रिय कनेक्शन एमएस एसक्यूएल सर्वर की कुल संख्या deterime 2005एमएस एसक्यूएल सर्वर 2005

उत्तर

223

यह प्रत्येक डीबी प्रति कनेक्शन की संख्या पता चलता है:

SELECT 
    DB_NAME(dbid) as DBName, 
    COUNT(dbid) as NumberOfConnections, 
    loginame as LoginName 
FROM 
    sys.sysprocesses 
WHERE 
    dbid > 0 
GROUP BY 
    dbid, loginame 

और यह कुल देता है:

SELECT 
    COUNT(dbid) as TotalConnections 
FROM 
    sys.sysprocesses 
WHERE 
    dbid > 0 

आप तो अधिक जानकारी की आवश्यकता है, चलाएं:

sp_who2 'Active' 

नोट: SQL सर्वर खाते का उपयोग 'sysadmin' भूमिका की आवश्यकता है (अन्यथा यह केवल एक पंक्ति और परिणाम के रूप में 1 की गणना करेगा)

+1

अद्भुत आपको बहुत बहुत धन्यवाद। मेरे जैसे नौसिखियों के लिए, SQL सर्वर प्रबंधन स्टूडियो प्रारंभ करें, अपने डेटाबेस पर राइट क्लिक करें, नई क्वेरी का चयन करें, इसे पेस्ट करें और "! जाओ" बटन पर क्लिक करें। –

+7

इसे न तो स्वीकार किया जाना चाहिए, न ही उच्चतम वोट दिया गया जवाब क्योंकि यह गलत है। यदि आप 'sa' के रूप में लॉग इन हैं तो आप केवल लौटाए गए नंबर पर भरोसा कर सकते हैं। यदि आप गैर-उपयोगकर्ता के रूप में लॉग इन हैं, तो आप 1 देखेंगे और यह वास्तविक कनेक्शन का प्रतिनिधि नहीं होगा। – ajeh

+3

@ajeh: यह निहित है कि आपके पास कार्य करने के लिए पर्याप्त अनुमतियां हैं। आपकी टिप्पणी अनावश्यक है। –

1

यदि आपका PHP ऐप कई SQL सर्वर कनेक्शन खोल रहा है, तो , जैसा कि आप जानते हैं, आपको अपने ऐप के डेटाबेस कोड में कोई समस्या है। इसे कनेक्शन के उपयोग और कनेक्शन पूलिंग का उपयोग करने के बाद उन कनेक्शनों को जारी/डिस्पोजे करना चाहिए। यहाँ विषय पर एक सभ्य लेख के लिए एक नज़र ...

http://www.c-sharpcorner.com/UploadFile/dsdaf/ConnPooling07262006093645AM/ConnPooling.aspx

7

@jwalkerjr उल्लेख किया है, आप कोड में कनेक्शन के निपटान किया जाना चाहिए (यदि कनेक्शन पूलिंग सक्षम किया गया है, वे तो बस कनेक्शन के लिए वापस आ रहे हैं पूल)। यह करने के लिए निर्धारित रास्ता 'using' कथन का उपयोग किया जाता है:

// Execute stored proc to read data from repository 
using (SqlConnection conn = new SqlConnection(this.connectionString)) 
{ 
    using (SqlCommand cmd = conn.CreateCommand()) 
    { 
     cmd.CommandText = "LoadFromRepository"; 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.AddWithValue("@ID", fileID); 

     conn.Open(); 
     using (SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) 
     { 
      if (rdr.Read()) 
      { 
       filename = SaveToFileSystem(rdr, folderfilepath); 
      } 
     } 
    } 
} 
+0

पूछताछकर्ता ने बताया कि वे PHP का उपयोग कर रहे थे, इसलिए कोड नमूना उनके लिए उपयुक्त नहीं हो सकता है। कचरा कलेक्टर स्वचालित रूप से गैर-निरंतर SQL सर्वर कनेक्शन को साफ़ कर लेता है जब उनके पास कोई संदर्भ नहीं होता है (और पृष्ठ संदर्भ के अंत में सभी संदर्भ गिराए जाएंगे), लेकिन हो सकता है कि पूछताछ लगातार कनेक्शन का उपयोग कर रही हो, जिसके लिए बुद्धिमान कनेक्शन की आवश्यकता हो पुन: उपयोग। –

0

देख sp_who यह तुम सिर्फ कनेक्शन

अपने मामले में

की संख्या को देखकर की तुलना में अधिक विवरण देता है मैं कुछ इस तरह करना होगा

DECLARE @temp TABLE(spid int , ecid int, status varchar(50), 
        loginname varchar(50), 
        hostname varchar(50), 
blk varchar(50), dbname varchar(50), cmd varchar(50), request_id int) 
INSERT INTO @temp 

EXEC sp_who 

SELECT COUNT(*) FROM @temp WHERE dbname = 'DB NAME' 
0

एमएस एसक्यूएल ज्ञान आधारित - कैसे खुला SQL डेटाबेस कनेक्शन (रों) और जो मेजबान पर कब्जा कर लिया पता करने के लिए।

नीचे दिए गए प्रश्न का उपयोग करके आपको सूची डेटाबेस, होस्ट नाम और खुली कनेक्शन गिनती की कुल संख्या मिल जाएगी, जिसके आधार पर आपको पता होगा कि मेजबान ने SQL कनेक्शन पर कब्जा कर लिया है।

SELECT DB_NAME(dbid) as DBName, hostname ,COUNT(dbid) as NumberOfConnections 
FROM sys.sysprocesses with (nolock) 
WHERE dbid > 0 
and len(hostname) > 0 
--and DB_NAME(dbid)='master' /* Open this line to filter Database by Name */ 
Group by DB_NAME(dbid),hostname 
order by DBName 
3

मुझे पता है कि यह पुराना है, लेकिन सोचा कि यह अपडेट करना एक अच्छा विचार होगा। यदि एक सटीक गिनती की आवश्यकता है, तो कॉलम ईसीआईडी ​​को भी फ़िल्टर किया जाना चाहिए। समांतर धागे वाले एक एसपीआईडी ​​sysprocesses में कई बार दिखा सकता है और ईसीआईडी ​​= 0 फ़िल्टरिंग प्रत्येक एसपीआईडी ​​के लिए प्राथमिक धागा वापस कर देगा।

SELECT 
    DB_NAME(dbid) as DBName, 
    COUNT(dbid) as NumberOfConnections, 
    loginame as LoginName 
FROM 
    sys.sysprocesses with (nolock) 
WHERE 
    dbid > 0 
    and ecid=0 
GROUP BY 
    dbid, loginame 
2

इस का उपयोग करें (एक ही कनेक्शन स्ट्रिंग का उपयोग करता है प्रत्येक उपयोगकर्ता/मेजबान प्रक्रिया मानकर) प्रत्येक कनेक्शन पूल के लिए एक सटीक गणना प्राप्त करने में

SELECT 
DB_NAME(dbid) as DBName, 
COUNT(dbid) as NumberOfConnections, 
loginame as LoginName, hostname, hostprocess 
FROM 
sys.sysprocesses with (nolock) 
WHERE 
dbid > 0 
GROUP BY 
dbid, loginame, hostname, hostprocess 
संबंधित मुद्दे