助けてください!
背景情報
SQL Server 2005 データベースにアクセスする WPF アプリケーションがあります。データベースは、アプリケーションが実行されているマシン上でローカルに実行されています。
Linq DataContext を使用するあらゆる場所で using { } ステートメントを使用し、DataContext コンストラクターに戻る前に、開かれ、それを使用して SqlCommand が実行された SqlConnection オブジェクトを返す関数の結果を渡します。
// In the application code
using (DataContext db = new DataContext(GetConnection()))
{
... Code
}
getConnection は次のようになります (読みやすくするために関数から「綿毛」を取り除きましたが、不足している追加機能はありません)。
// Function which gets an opened connection which is given back to the DataContext constructor
public static System.Data.SqlClient.SqlConnection GetConnection()
{
System.Data.SqlClient.SqlConnection Conn = new System.Data.SqlClient.SqlConnection(/* The connection string */);
if ( Conn != null )
{
try
{
Conn.Open();
}
catch (System.Data.SqlClient.SqlException SDSCSEx)
{
/* Error Handling */
}
using (System.Data.SqlClient.SqlCommand SetCmd = new System.Data.SqlClient.SqlCommand())
{
SetCmd.Connection = Conn;
SetCmd.CommandType = System.Data.CommandType.Text;
string CurrentUserID = System.String.Empty;
SetCmd.CommandText = "DECLARE @B VARBINARY(36); SET @B = CAST('" + CurrentUserID + "' AS VARBINARY(36)); SET CONTEXT_INFO @B";
try
{
SetCmd.ExecuteNonQuery();
}
catch (System.Exception)
{
/* Error Handling */
}
}
return Conn;
}
アプリケーションが WPF であることが、私が抱えている問題に関係しているとは思いません。
私が抱えている問題
Sql Server Management studio で SqlConnection が DataContext と共に破棄されているにもかかわらず、次のように開いている接続の負荷をまだ見ることができます。
status : 'Sleeping'
command : 'AWAITING COMMAND'
last SQL Transact Command Batch : DECLARE @B VARBINARY(36); SET @B = CAST('GUID' AS VARBINARY(36)); SET CONTEXT_INFO @B
最終的に接続プールが使い果たされ、アプリケーションは続行できなくなります。
したがって、どういうわけか SQLCommand を実行して Context_Info を設定することは、DataContext が破棄されたときに接続が破棄されないことを意味しているとしか言えません。
接続が使用されている DataContext が破棄されたときに、接続が閉じられて破棄されるのを止める明らかなことを誰でも見つけることができますか?