i Удалите объект SqlConnection, но, конечно, он на самом деле не закрыт . Мне нужно закрытое соединение, чтобы не удерживать блокировки на объектах базы данных. Как я могу предотвратить удержание замков закрытыми соединениями?
Объяснение вышеупомянутой отправки для тех, кто не знает:
Когда вы закрываете соединение ADO или ADO.NET, вы фактически не разрываете соединение с SQL Server. Инфраструктура ADO / ADO.NET поддерживает соединение на случай, если вы захотите использовать его снова. Соединения сохраняются в так называемом «пуле соединений».
После нескольких минут неиспользования соединение будет фактически закрыто. Хотя, не совсем. TCP / IP имеет свой собственный метод, позволяющий держать соединения TCP открытыми еще несколько минут (в состоянии « CLOSE_WAIT »). Это делается в случае, если вы снова попросите открыть TCP-соединение с тем же IP: Port. Если это так, он может использовать это уже открытое TCP-соединение.
При использовании пула соединений и SQL Server соединение все еще установлено с SQL Server. Каждое соединение имеет контекст базы данных, в котором оно находится. Пока соединение находится в этой базе данных: оно поддерживает блокировку общей базы данных (S-DB) в этой базе данных.
Блокировка общей базы данных просто означает: «Не удаляйте эту базу данных, пока я в ней, пожалуйста».
Как я могу предотвратить удержание общей блокировки в моей базе данных, сохраняя при этом преимущества пула соединений?
Мое специальное решение прямо сейчас каждый раз, когда разработчик называет Dispose:
connection.Dispose()
превратить его в вызов глобальной вспомогательной функции:
Database.DisposeConnection(connection);
, который изменяет контекст базы данных на master :
public static void DisposeConnection(SqlConnection connection)
{
//Stop holding a database lock - in my database at least
ADOHelper.ExecuteNonQuery(connection, "USE master");
connection.Dispose();
}
Это решает мою непосредственную проблему; закрытые соединения не удерживают блокировку моей базы данных.
Но теперь я боюсь, что у пула соединений будет разбитый мозг - потому что я переключал контексты базы данных за его спиной.
Если кто-то не знал или думал иначе:
С SDK :
Закрыть и Утилизировать функционально
эквивалент.