请帮忙!
背景信息
我有一个 WPF 应用程序,它访问运行在本地机器上的 SQL Server 2005 数据库。每当我使用 Linq DataContext 时,都会使用 using { } 语句,并传入一个函数的结果,该函数返回已打开并使用 SqlCommand 执行过的 SqlConnection 对象,然后返回给 DataContext 构造函数。例如:
// 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 被处理掉时,连接没有被处理掉。
有人能找出明显阻止连接被关闭和处理的原因吗?