Я понимаю, что если я создаю экземпляр объекта SqlConnection, я действительно захватываю соединение из пула соединений. Когда я вызову Open(), он откроет соединение. Если я вызываю метод Close() или Dispose() в этом объекте SqlConnection, он возвращается в пул соединений.
Однако это не говорит мне, действительно ли он закрыт, или если у меня все еще есть активное подключение к базе данных.
Как заставить SqlConnection закрываться на сетевом уровне или, по крайней мере, указывать, когда он закрывается?
Пример:
using(SqlConnection conn = new SqlConnection(DBConnString)) {
conn.Open();
SqlCommand cmd = conn.CreateCommand();
...
cmd.ExecuteReader(CommandBehavior.CloseConnection);
...
}
- Первый запуск: 300 мс
- Второй запуск: 100 мс
- Третий запуск: 100 мс
- После долгого ожидания (30 минут): 300 мс
Если соединение было закрыто TRULY, второй и третий прогоны также должны составлять 300 мс. Но я знаю, что соединение не действительно закрыто для этих прогонов (я проверил монитор активности SQL Server). Для выполнения аутентификации и т.д. Не требуется дополнительных 200 мс.
Как принудительно закрыть соединение?
Идеи
- Работает ли CommandBehavior.CloseConnection? (видимо, нет?)
- Работает ли настройка "Max Pool Size = 0" в строке подключения? (это было бы пирровым решением)
- Работает ли Dispose()?
Ссылки
- Статья Пул соединений
- Здесь еще один, который говорит нам, что Close() действительно не закрывает соединение.
- Статья о плюсах и минух пула соединений