Раньше сегодня я нашел ошибку в одном из наших проектов - есть соединение с базой данных, которая никогда не закрывается, я имею в виду, что метод Close() никогда не вызывается. Однако, когда я закрываю приложение, соединение закрывается (многократно проверяется в студии управления sql). Зачем?Что происходит с закрытым подключением к базе данных?
ответ
Соединение закрывается при выходе приложения. Читайте дальше: SqlConnection's Finalize. Из документации MSDN для Object.Finalize:
«Во время остановки домена приложения Finalize автоматически вызывается объектам, которые не освобождаются от завершения, даже те, которые все еще доступны».
SQL-соединения дороги для создания, и ADO.NET использует технику, называемую пулом соединений, которая позволяет их повторно использовать.
Цитата MSDN:
Настоятельно рекомендуется всегда закрыть соединение, когда вы закончите использовать его так, что он будет возвращается в пул соединений и быть использованы повторно.
Если максимальный размер пула был равен , и нет доступного соединения , запрос поставлен в очередь. Затем пул пытается восстановить любые соединения , пока тайм-аут не достигнет (значение по умолчанию - 15 секунд). Если пул не может удовлетворить запрос до момента подключения , исключение выдается.
Фактически из-за пула соединений SQL-соединение никогда не закрывается - оно просто возвращается в пул, чтобы повторно использовать его при вызове Close. Он будет закрыт, когда домен приложения будет уничтожен, когда вы выйдете из приложения. Поэтому, если вы никогда не вызываете Close, соединение не будет использоваться повторно, и как только пул будет исчерпан, вы получите исключение. –
@ darin- никогда не закрывается неправильно. После определенного количества бездействия соединение будет закрыто, но это просто придирание. – RichardOD
@ RichardOD, я бы не сказал, что это ничто. На самом деле я этого не знал. Большое спасибо за эту точность. –
Когда вы выходите из приложения в обычном режиме, я ожидаю, что финализаторы будут работать. Они закрывают соединение, если оно все еще открыто. Просто не зависеть от этого: это может занять некоторое время, прежде чем эти финализаторы будут работать при нормальной работе вашего приложения, поэтому вы будете держать слишком много соединений открытым.
Когда приложение выходит из строя, возможно, финализатор не будет запущен, оставив соединение открытым после срока службы приложения.
Еще одна вещь, о которой нужно помнить, это то, что в .Net вы можете обернуть свои соединения в блок использования, и это закроет и удалит ваши подключения для вас. Таким образом, отсутствие явного закрытия() не плохо, если у вас есть свои блоки, используя там ...
// this using block will auto close & dispose your connection...
using (var conn = new SqlConnection(...))
{
conn.Open();
// database code here with no explicit close
}
, что является функциональным эквивалентом попытки /, наконец, блок с conn.Close в конечном итоге. Многие разработчики пропускают блоки использования - убедитесь, что вы не делаете то же самое в этом случае.
Если вы переписываете свой код, чтобы закрыть свои соединения - рекомендуется использовать использование блоков вокруг всех ваших объектов базы данных (соединение, команда, читатель), чтобы убедиться, что они закрываются и удаляются, когда они выходят из сферы действия используемого блока. Я бы определенно предложил записать их в ваш код, а не просто conn.Close() там, где это необходимо.
- 1. Механика тестирования с подключением к базе данных
- 2. multidplyr с подключением к базе данных
- 3. Проблема с подключением к базе данных Django
- 4. Устранение неполадок с подключением к базе данных
- 5. MVC: Проблемы с подключением к базе данных
- 6. Что случилось с моим подключением к базе данных?
- 7. Служба Windows с подключением к базе данных
- 8. Проблема с подключением к базе данных
- 9. Java Swing с подключением к базе данных
- 10. Проблемы с подключением к базе данных MySQL
- 11. проблемы с подключением к базе данных
- 12. Помощь с подключением к базе данных
- 13. Wordpress Plugin с подключением к базе данных
- 14. Проблемы с подключением к базе данных CE
- 15. Управление подключением к базе данных весной
- 16. Что произойдет, если активность или фрагмент завершены с закрытым подключением к базе данных, открытым в нем, в android?
- 17. CrystalReports ReportDocument утечка памяти с подключением к базе данных
- 18. Что происходит с подключением MySQL при утере интернет-соединения?
- 19. Проблемы с подключением к базе localhost
- 20. Проблемы с php-подключением к базе данных mySQL
- 21. Проблемы с подключением к базе данных mySql на целевой машине
- 22. Проблемы с подключением к базе данных MusicBrainz с использованием psycopg2
- 23. Вход в C# с подключением к базе данных SQL Server
- 24. Проблемы с подключением к базе данных с использованием класса PDO
- 25. Проблемы с подключением к базе данных .sdf через SqlConnection/SqlCeConnection
- 26. Что делать, если что-то связанное с подключением к базе данных идет не так?
- 27. Проблемы с подключением к базе данных MySQL с помощью PHP
- 28. Проблема с подключением к базе данных .NET DBF
- 29. MAMP работает очень медленно с внешним подключением к базе данных
- 30. Соображения для создания многопоточного агрегатора с подключением к базе данных
«Если SqlConnection выходит за пределы области видимости, он не будет закрыт, поэтому вы должны явно закрыть соединение, вызвав Close или Dispose». - это также из msdn, не означает ли это, что соединение не может быть закрыто, если вы не вызываете Close()? – agnieszka
В основном вы можете делать Close, Dispose или use() {}, как и должно быть. Когда приложение закроется, соединения также будут закрыты по той причине, о которой я сказал в своем ответе. – RichardOD
Также, если GC в любое время решит завершить соединения, то они также будут закрыты. – RichardOD