Закрыть или не закрыть соединение в базе данных - PullRequest
9 голосов
/ 10 февраля 2011

Я работаю с Windows-Mobile and Windows-CE, используя SqlCE, и я не знаю, что лучше сделать.

Чтобы открыть соединение при открытии программы, выполните любой запрос ... обновить ... удалить базу данных и закрыть соединение после закрытия программы?

Или открыть соединение, выполнить любой запрос ... обновить ... удалить базу данных и немедленно закрыть соединение?

Ответы [ 7 ]

13 голосов
/ 11 февраля 2011

Nice.Ответы повсюду.Вот что я знаю по своему опыту и взаимодействию с командой SQL Compact:

  1. Закрытие соединения сбрасывает внесенные вами изменения, в противном случае движок ожидает период сброса, прежде чем это сделать.Хорошая идея - закрыть соединение, когда вы закончите, используя его, чтобы убедиться, что ваши изменения действительно поступят в магазин.Потеря питания после записи и перед сбросом приведет к потере данных.
  2. Официального пула соединений нет, но открытие первого соединения дорого (т. Е. Медленно), все остальные - быстрые.Рекомендация, которую я получил от команды, заключается в том, чтобы на самом деле создать соединение при запуске приложения и просто оставить его открытым.На самом деле вам не нужно его использовать, но если держать его открытым, кешируется много информации о соединениях, поэтому последующие соединения с одним и тем же хранилищем быстрые.

Так что ответ, на самом деле, оба.

Редактировать

Для тех, кто заинтересован, хороший пример того, как это работает, можно увидеть в библиотеке OpenNETCF ORM .Библиотека по умолчанию создает соединение «обслуживания», которое остается открытым и используется для выполнения таких задач, как запросы схемы.Все остальные операции с данными используют свое собственное соединение.Вам также необходимо настроить библиотеку на повторное использование одного подключения в течение срока службы Магазина или использовать новое подключение каждый раз, когда оно касается магазина.Исполнение и поведение всегда были лучшими во всех моих проектах с использованием значения по умолчанию (именно поэтому я установил его по умолчанию).

3 голосов
/ 10 февраля 2011

Всегда оставляйте соединение открытым в течение всего срока службы вашего приложения для Windows Mobile.Открытие базы данных SQL Server Compact является дорогостоящей операцией.

2 голосов
/ 10 февраля 2011

Здесь уже есть несколько противоречивых ответов.

Если честно, я не совсем уверен, как WinCE работает с соединениями. Я не думаю, что есть ConnectionPool.

Но общая закономерность в .NET - держать соединения открытыми как можно короче. Это повышает надежность и предотвращает утечку ресурсов. Убедитесь, что вы знаете о шаблоне using (var conn = ...) { ... }.

Так что я бы сказал: переходите ко второму варианту и сохраняйте соединения дольше, только если вы действительно испытываете проблемы с производительностью, и если причиной является открытие соединения. Я не думаю, что это будет с SqlCE

2 голосов
/ 10 февраля 2011

Установление соединения является медленной операцией, поэтому его создание и закрытие может замедлить работу приложения.С другой стороны, если у вас много клиентов, пул соединений будет заполнен очень быстро, и другие клиенты не смогут подключиться.

2 голосов
/ 10 февраля 2011

Вам следует закрывать соединение каждый раз, когда вы выполняете транзакцию sql для освобождения портов подключения. Всегда хорошая практика, чтобы избежать нарушения безопасности.

1 голос
/ 10 февраля 2011

На однопользовательской платформе, такой как wince, держать соединение открытым не вредно, и вы можете получить более высокую производительность.

0 голосов
/ 13 августа 2016

Если вас беспокоит потеря данных из-за того, что вы не часто звоните Close(), вы можете выполнить свой код в транзакции, которая немедленно фиксирует изменения на диске:

using (SqlCeTransaction transaction = this.connection.BeginTransaction())
{
    using (SqlCeCommand command = new SqlCeCommand(query, connection))
    {
        command.Transaction = transaction;
        command.ExecuteNonQuery();
    }
    transaction.Commit(CommitMode.Immediate);
}

Конечно, при использовании CommitMode.Immediate все еще наблюдается потеря производительности.

...