Пожалуйста, помогите!
Фоновая информация
У меня есть приложение WPF, которое обращается к базе данных SQL Server 2005. База данных выполняется локально на компьютере, на котором запущено приложение.
Всюду, где я использую Linq DataContext, я использую оператор {} и передаю результат функции, которая возвращает объект SqlConnection, который был открыт, и выполнил его с помощью SqlCommand перед возвратом к конструктору 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, имеет какое-либо отношение к проблеме, которую я имею.
Проблема, с которой я сталкиваюсь
Несмотря на то, что SqlConnection размещается вместе с DataContext в студии Sql Server Management, я все еще вижу множество открытых подключений с помощью:
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, которые они используют?