PHP/MS Sql Server 2005/win 2003アプリケーションが非常に応答しなくなることがありますが、メモリ/ CPUの使用量は急増しません。 SQL Management Studioから新しい接続を開こうとすると、接続を開くダイアログボックスでハングします。アクティブな接続の合計数を決定する方法ms SQL Server 2005
これは、各DBごとの接続数を示しています。
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アカウントには「sysadmin」ロールが必要です(そうでない場合は、結果として1つの行と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);
}
}
}
}
これを使用して、各接続プールの正確なカウントを取得します(各ユーザー/ホストプロセスが同じ接続文字列を使用すると仮定)
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
これは古いことは知っていますが、更新することをお勧めします。正確なカウントが必要な場合は、おそらく列ECIDもフィルタリングする必要があります。並列スレッドを持つ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
PHPアプリが多くのSQL Server接続を開いている場合、ご存知かもしれませんが、アプリのデータベースコードに問題があります。使用後に接続を解放/破棄し、接続プーリングを使用する必要があります。トピックに関するまともな記事はこちらをご覧ください...
http://www.c-sharpcorner.com/UploadFile/dsdaf/ConnPooling07262006093645AM/ConnPooling.aspx
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
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'