Cómo determinar el número total de conexiones abiertas / activas en ms sql server 2005
-
03-07-2019 - |
Pregunta
Mi aplicación PHP / MS Sql Server 2005 / win 2003 ocasionalmente deja de responder, el uso de la memoria / CPU no aumenta. Si trato de abrir una nueva conexión desde el estudio de administración de SQL, entonces simplemente se cuelga en el cuadro de diálogo de conexión abierta. cómo determinar el número total de conexiones activas ms sql server 2005
Solución
Esto muestra el número de conexiones por cada DB:
SELECT
DB_NAME(dbid) as DBName,
COUNT(dbid) as NumberOfConnections,
loginame as LoginName
FROM
sys.sysprocesses
WHERE
dbid > 0
GROUP BY
dbid, loginame
Y esto da el total:
SELECT
COUNT(dbid) as TotalConnections
FROM
sys.sysprocesses
WHERE
dbid > 0
Si necesita más detalles, ejecute:
sp_who2 'Active'
Nota: la cuenta de SQL Server utilizada necesita el rol de "administrador del sistema" (de lo contrario, solo mostrará una fila individual y un recuento de 1 como resultado)
Otros consejos
Como se mencionó en @jwalkerjr, debe desechar las conexiones en el código (si la agrupación de conexiones está habilitada, solo se devuelven a la agrupación de conexiones). La forma prescrita de hacer esto es usar la declaración ' 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);
}
}
}
}
Sé que esto es antiguo, pero pensé que sería una buena idea actualizar. Si se necesita un recuento preciso, la columna ECID probablemente también debería filtrarse. Un SPID con subprocesos paralelos puede aparecer varias veces en sysprocesses y el filtrado de ECID = 0 devolverá el subproceso primario para cada 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
Use esto para obtener un recuento preciso para cada grupo de conexiones (asumiendo que cada proceso de usuario / host usa la misma cadena de conexión)
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
Si su aplicación PHP mantiene abiertas muchas conexiones de SQL Server, entonces, como puede saber, tiene un problema con el código de la base de datos de su aplicación. Debería estar liberando / desechando esas conexiones después del uso y utilizando la agrupación de conexiones. Echa un vistazo aquí para ver un artículo decente sobre el tema ...
http://www.c-sharpcorner.com/UploadFile /dsdaf/ConnPooling07262006093645AM/ConnPooling.aspx
vea sp_who que le brinda más detalles que solo ver el número de conexiones
En tu caso, yo haría algo como esto
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'
Basado en el conocimiento de MS SQL: cómo saber si hay conexiones de base de datos SQL abiertas y en qué host están ocupados.
Usando la siguiente consulta, encontrará la base de datos de la lista, el nombre del host y el número total de conexiones abiertas, según la idea que tenga, qué host ha ocupado la conexión 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