كيفية تحديد العدد الإجمالي للاتصالات المفتوحة/النشطة في خادم MS SQL 2005
-
03-07-2019 - |
سؤال
يصبح تطبيق 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