Как правильно закрыть соединение для доступа к базе данных - PullRequest
0 голосов
/ 13 марта 2012

На данный момент наш код выглядит так

   public void Close(bool saveChange)
    {
        if ((_Connection != null) && (_Connection.State == System.Data.ConnectionState.Open))
        {

            _Connection.Close();
            _Connection.Dispose();
            _Connection = null;
            GC.Collect();
        }
    }

Где GC.Collect () необходим для правильного закрытия файла и удаления всех файлов .ldb. Можно ли закрыть файл db и удалить все файлы temp .ldb без необходимости вызова GC?

Ответы [ 4 ]

4 голосов
/ 13 марта 2012

Как и в каждом классе, реализующем IDisposable, вы должны использовать using -статист для удаления объектов. На этом пути соединения также закрываются.

Например:

using(var conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Server.MapPath("Pets/Pets.mdb")))
{
     conn.open();
     // do something with it
}

Вы должны также прочитать это , потому что способ, которым вы используете соединения, может быть улучшен. Практическое правило: всегда создавайте, открывайте, используйте и закрывайте соединения в одном месте и позвольте пулу соединений ADO.NET управлять базовыми соединениями.

2 голосов
/ 13 марта 2012

Если у вас есть класс, который использует данные в нескольких точках входа.и вы должны держать соединение открытым.(следовательно, нельзя использовать , используя оператор (Connection x = ...) {} )

.

ваш класс также должен наследовать IDisposable и реализовывать

void Dispose()
{
  this.dbConnection.Dispose();
}

dbConnection.Dispose () позаботится о корректном закрытии соединения, если только вам не понадобятся какие-либо пользовательские действия (например, выход из системы, сохранение информации в кэше и т. Д.)

В любом случае, я заидеи @Tim Schmelter:

  1. Закрыть соединение после любой транзакции.

  2. Соединения будут кэшироваться в пуле соединений => незначительная производительностьудар.

1 голос
/ 13 марта 2012

Вызов GC.Collect () может оказаться не лучшим решением, так как этот метод собирает весь «мусор».Может оказаться полезным использовать ключевое слово using.например,

using (OleDbConnection connection = new OleDbConnection(connectionString))
{
    connection.Open();
    // Do work here.
}

Сразу после использования блока объект подключения будет удален!

с использованием соединений , msdn

с использованием ключевого слова , msdn

0 голосов
/ 19 августа 2018

connection.close (); OleDbConnection.ReleaseObjectPool ();

Это решило это для меня в конечном итоге

...