2015-02-25 9 views
0

Состояние Microsoft: «Если SqlConnection выходит за пределы области видимости, он не будет закрыт». Я этого не понимаю. SqlConnection - это ADO.NET объект, даже если он использует неуправляемый ресурс за кулисами, так почему сборщик мусора не очищает его? Когда он выходит из сферы действия, он должен быть уничтожен. Может кто-то пролить свет на это, это ломает мой мозг.Почему SqlConnection не закрывается, когда отсутствует область действия

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.close%28v=vs.110%29.aspx

Благодаря

+1

Возможно, вы проведете [будет SqlConnection получить для GC] (http://stackoverflow.com/questions/3637549/will-sqlconnection-get-disposed-by-gc) для хорошего общего обсуждения этой проблемы. В конце концов, вы не должны ожидать слишком много помощи, потому что, если вы позволяете открытому подключению выходить из сферы действия, это ошибка в вашем коде, простая и простая. –

ответ

1

SqlConnection расположен, когда она завершена. Это происходит потому, что он наследует от Component, который has a finalizer that calls Dispose. Завершение является одним из этапов сбора мусора. Сбор мусора работает недетерминированно, т. Е. Всякий раз, когда CLR чувствует себя так. Garbage collection in C# is totally unrelated to an object going out of scope.

Таким образом, если SqlConnection выходит за пределы сферы действия, он в какой-то момент в будущем будет завершен и поэтому закрыт. Это плохо, потому что до тех пор, пока эта доработка не оправдалась, вы тратите ресурсы. Позже в вашей программе вы можете не открыть соединение, потому что слишком много соединений уже открыты (хотя они фактически не используются и просто ждут завершения).

Именно поэтому настоятельно рекомендуется убрать ваши SqlConnections после их использования.

(Не читайте это как каноническую правду о том, как работает финализация SqlConnection. Я упростил детали, чтобы сосредоточиться на различии между окончательной доработкой и явным удалением).

+1

Большое спасибо за особенно четкое объяснение! – mils