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