Comment déterminer le nombre total de connexions ouvertes / actives dans ms SQL Server 2005
-
03-07-2019 - |
Question
Mon application PHP / MS Sql Server 2005 / win 2003 devient parfois très instable, l’utilisation de la mémoire / du cpu ne augmente pas. Si j'essaie d'ouvrir une nouvelle connexion à partir de SQL Management Studio, alors il se bloque dans la boîte de dialogue de connexion ouverte. comment déterminer le nombre total de connexions actives ms sql server 2005
La solution
Ceci indique le nombre de connexions par DB:
SELECT
DB_NAME(dbid) as DBName,
COUNT(dbid) as NumberOfConnections,
loginame as LoginName
FROM
sys.sysprocesses
WHERE
dbid > 0
GROUP BY
dbid, loginame
Et cela donne le total:
SELECT
COUNT(dbid) as TotalConnections
FROM
sys.sysprocesses
WHERE
dbid > 0
Si vous avez besoin de plus de détails, lancez:
sp_who2 'Active'
Remarque: Le compte SQL Server utilisé a besoin du rôle "sysadmin" (sinon, il affichera une seule ligne et un nombre égal à 1)
Autres conseils
Comme @jwalkerjr l'a mentionné, vous devez supprimer les connexions en code (si le regroupement de connexions est activé, elles sont simplement renvoyées au pool de connexions). Pour ce faire, vous devez utiliser l'instruction ' à l'aide de
':
// 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);
}
}
}
}
Je sais que c'est vieux, mais j'ai pensé que ce serait une bonne idée de mettre à jour. Si un comptage précis est nécessaire, alors la colonne ECID devrait probablement aussi être filtrée. Un SPID avec des threads parallèles peut apparaître plusieurs fois dans sysprocesses et le filtrage ECID = 0 renvoie le thread principal pour chaque 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
Utilisez-le pour obtenir un décompte précis pour chaque pool de connexions (en supposant que chaque processus utilisateur / hôte utilise la même chaîne de connexion)
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 votre application PHP maintient ouverte de nombreuses connexions SQL Server, alors, comme vous le savez peut-être, vous rencontrez un problème avec le code de la base de données de votre application. Il devrait libérer / éliminer ces connexions après utilisation et utiliser le regroupement de connexions. Regardez ici pour un article décent sur le sujet ...
http://www.c-sharpcorner.com/UploadFile /dsdaf/ConnPooling07262006093645AM/ConnPooling.aspx
voir sp_who , il vous fournit davantage de détails que le simple affichage du numéro. des connexions
dans votre cas, je voudrais faire quelque chose comme ça
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'
Basé sur les connaissances MS SQL - Comment connaître les connexions de base de données SQL ouvertes et occupé sur quel hôte.
En utilisant la requête ci-dessous, vous trouverez la base de données de liste, le nom d’hôte et le nombre total de connexions ouvertes, en fonction de votre choix, de l’hôte ayant occupé la connexion 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