كيفية تحديد العدد الإجمالي للاتصالات المفتوحة/النشطة في خادم MS SQL 2005

StackOverflow https://stackoverflow.com/questions/216007

سؤال

يصبح تطبيق PHP/MS Sql Server 2005/win 2003 الخاص بي في بعض الأحيان غير مستجيب للغاية، ولا يرتفع استخدام الذاكرة/وحدة المعالجة المركزية.إذا حاولت فتح أي اتصال جديد من استوديو إدارة SQL، فسيتم تعليقه في مربع حوار فتح الاتصال.كيفية تحديد العدد الإجمالي للاتصالات النشطة لخادم MS SQL 2005

هل كانت مفيدة؟

المحلول

يوضح هذا عدد الاتصالات لكل قاعدة بيانات:

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 Server المستخدم إلى دور "مسؤول النظام" (وإلا فإنه سيعرض صفًا واحدًا فقط وعدد 1 كنتيجة)

نصائح أخرى

وكما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);
            }
        }
    }
}

وأعرف أن هذا هو القديم، ولكن أعتقد أنه سيكون فكرة جيدة لتحديث. إذا كانت هناك حاجة إجراء إحصاء دقيق، ثم عمود ECID ربما ينبغي أن تتم تصفيته أيضا. A SPID مع المواضيع موازية يمكن أن تظهر عدة مرات في sysprocesses وECID تصفية = 0 سيعود ترابط الأساسي لكل SPID.

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

استخدم هذا للحصول على إجراء إحصاء دقيق لكل تجمع الاتصال (على افتراض يستخدم كل عملية المستخدم / المضيف سلسلة الاتصال نفسها)

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

إذا التطبيق الخاص بي هو عقد فتح العديد من اتصالات SQL Server ثم، كما تعلمون، لديك مشكلة مع رمز قاعدة بيانات التطبيق الخاص بك. وينبغي أن يكون الإفراج عن / التخلص تلك الاتصالات بعد الاستخدام واستخدام تجمع الاتصال. إلقاء نظرة هنا للحصول على المادة الكريم على الموضوع ...

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

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'

تعتمد معرفة MS SQL - كيفية معرفة اتصال (اتصالات) قاعدة بيانات 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top