Come determinare il numero totale di connessioni aperte / attive in ms sql server 2005
-
03-07-2019 - |
Domanda
Il mio PHP / MS Sql Server 2005 / win 2003 A volte l'applicazione non risponde molto, l'utilizzo della memoria / CPU non aumenta. Se provo ad aprire una nuova connessione da sql management studio, allora si blocca nella finestra di dialogo di connessione aperta. come determinare il numero totale di connessioni attive ms sql server 2005
Soluzione
Questo mostra il numero di connessioni per ciascun DB:
SELECT
DB_NAME(dbid) as DBName,
COUNT(dbid) as NumberOfConnections,
loginame as LoginName
FROM
sys.sysprocesses
WHERE
dbid > 0
GROUP BY
dbid, loginame
E questo dà il totale:
SELECT
COUNT(dbid) as TotalConnections
FROM
sys.sysprocesses
WHERE
dbid > 0
Se hai bisogno di maggiori dettagli, esegui:
sp_who2 'Active'
Nota: l'account SQL Server utilizzato richiede il ruolo "amministratore di sistema" (altrimenti mostrerà solo una riga e un conteggio di 1 come risultato)
Altri suggerimenti
Come accennato da @jwalkerjr, dovresti eliminare le connessioni nel codice (se il pool di connessioni è abilitato, vengono appena restituite al pool di connessioni). Il modo prescritto per farlo è usare l'istruzione " 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);
}
}
}
}
So che è vecchio, ma ho pensato che sarebbe una buona idea aggiornarlo. Se è necessario un conteggio accurato, probabilmente anche la colonna ECID dovrebbe essere filtrata. Uno SPID con thread paralleli può essere visualizzato più volte nei processi di sistema e il filtro ECID = 0 restituirà il thread primario per ogni 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
Utilizzalo per ottenere un conteggio accurato per ogni pool di connessioni (supponendo che ogni processo utente / host utilizzi la stessa stringa di connessione)
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
Se l'app PHP tiene aperte molte connessioni di SQL Server, allora, come forse saprai, hai un problema con il codice del database dell'app. Dovrebbe essere il rilascio / eliminazione di tali connessioni dopo l'uso e l'utilizzo del pool di connessioni. Dai un'occhiata qui per un articolo decente sull'argomento ...
http://www.c-sharpcorner.com/UploadFile /dsdaf/ConnPooling07262006093645AM/ConnPooling.aspx
vedi sp_who ti dà più dettagli che vedere solo il numero di connessioni
nel tuo caso farei qualcosa del genere
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'
Basata sulla conoscenza di MS SQL - Come sapere connessioni di database SQL aperte e occupate su quale host.
Usando la query seguente troverai il database degli elenchi, il nome host e il numero totale di conteggi di connessioni aperte, in base a ciò avrai idea di quale host abbia occupato la connessione 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