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