Правильно ли закрывать соединение с базой данных в методе Dispose?

StackOverflow https://stackoverflow.com/questions/1016800

Вопрос

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

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

        _disposed = true;
    }
}

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

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

Это было полезно?

Решение

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

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

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

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

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

Cédric

Другие советы

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

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

http://msdn.microsoft .com / EN-US / библиотека / system.data.sqlclient.sqlconnection.close.aspx

  

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top