Правильно ли закрывать соединение с базой данных в методе Dispose? - PullRequest
5 голосов
/ 19 июня 2009

У меня было подозрение, что соединение с базой данных, используемое в одном из наших приложений, не всегда закрыто. Я пошел посмотреть код и нашел класс DataProvider, который имеет SqlConnection объект. Соединение открывается в конструкторе этого класса и закрывается в его методе Dispose (не судите об этом, я знаю, что поддерживать открытое соединение - зло, это просто не мой код, и в любом случае это не главное). Метод Dispose реализован так:

protected virtual void Dispose(bool disposing)
{
    if (!_disposed)
    {
        if (disposing)
        {
            if (_conn != null)
                _conn.Close();
        }

        _disposed = true;
    }
}

Вопрос:
Всегда ли это гарантирует, что соединение закрыто?
Правильно ли этот код?

Я думаю, что должен быть вызван _conn.Dispose() - я прав и может ли это повлиять на не закрытие соединения (вероятно, нет)?

Ответы [ 2 ]

8 голосов
/ 19 июня 2009

Утилизация никогда не вызывается автоматически.

Соединение не будет закрыто до тех пор, пока метод Dispose вашего объекта не будет вызван явно, или если ваш класс используется в блоке using ()

Более безопасный способ - вызвать метод dispose в финализаторе и убедиться, что финализатор подавлен при вызове метода Dispose.

В этой статье представлен правильный способ реализации шаблона

Надеюсь, это поможет!

Седрик

2 голосов
/ 19 июня 2009

conn.Dispose(); также закроет соединение, поэтому не помешает изменить его в соответствии с шаблоном утилизации.

Но есть функционально эквивалентные, поэтому должна быть проблема, где.

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.close.aspx

Если SqlConnection выходит из сфера, она не будет закрыта. Следовательно, Вы должны явно закрыть соединение по телефону Закрыть или Dispose. Закрыть и утилизировать функционально эквивалентный. Если значение пула соединений установить в true или да, основной соединение возвращается к пул подключений. С другой стороны, если Пул установлен на ложь или нет, базовое соединение с сервером закрыты.

...