web-dev-qa-db-fra.com

Comment déterminer le nombre total de connexions ouvertes/actives dans ms SQL Server 2005

Mon application PHP/MS Sql Server 2005/win 2003 devient parfois très instable, l'utilisation de la mémoire/du processeur 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

84
jagan

Ceci montre le nombre de connexions par chaque 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).

237
Mitch Wheat

Comme @jwalkerjr l'a mentionné, vous devriez éliminer les connexions en code (si le regroupement de connexions est activé, elles sont simplement renvoyées au pool de connexions). La façon prescrite de faire ceci est d'utiliser l'instruction '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);
            }
        }
    }
}
7
Mitch Wheat

Utilisez-le pour obtenir un nombre précis pour chaque pool de connexions (en supposant que chaque utilisateur/processus 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
4
realstrategos

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
3
sqldba.today

Si votre application PHP maintient ouverte de nombreuses connexions SQL Server, vous avez probablement 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. Jetez un oeil ici pour un article décent sur le sujet ...

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

1
jwalkerjr

Connaissances basées sur MS SQL - Comment savoir ouvrir une ou plusieurs connexions de base de données SQL et occuper quel hôte.

En utilisant la requête ci-dessous, vous trouverez la base de données de la liste, le nom d’hôte et le nombre total de connexions ouvertes, en fonction de votre choix, 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
0
Tarun Harkinia

voir sp_who il vous donne plus de détails que juste voir le nombre de connexions 

dans votre cas, je ferais 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'
0
Mina Gabriel