Можно ли всегда оставлять соединение с базой данных открытым? - PullRequest
23 голосов
/ 29 марта 2011

В свободное время я работаю над однопользовательским приложением баз данных для настольных компьютеров, и я всегда неуверен в выборе дизайна, который я делаю.В настоящий момент, когда пользователь хочет взаимодействовать с базой данных (которая является локальной базой данных SQLite, поэтому обычно ее видит только один пользователь), приложение создает новое соединение и делает все, что ему нужно,а затем закрывает соединение.Следовательно, в ходе одного выполнения приложения создается и удаляется множество соединений.

Это, как правило, "лучший" способ сделать это, или приложение должно открыть соединение при запуске итолько закрыть его, когда приложение выходит?Каковы преимущества / недостатки каждого метода?

Ответы [ 6 ]

26 голосов
/ 29 марта 2011

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

Одним из возможных исключений может быть, если вам нужно, чтобы несколько потоков вашего приложения обращались к базе данных одновременно. Затем вы можете заставить их подождать и совместно использовать один объект соединения, ИЛИ , вы можете попытаться создать новые соединения для разных потоков. Я никогда не пробовал это на самом деле в SQLite. Это одна из ситуаций, когда закрытие основного соединения и открытие / закрытие нескольких соединений может быть лучше для настольного приложения.

Для веб-приложений или клиентских / серверных настольных приложений я бы не рекомендовал оставлять соединения открытыми.

7 голосов
/ 29 марта 2011

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

Это несколько косвенно, однако обычно рекомендуется закрывать его после использования, чтобы оно снова стало доступным в пуле.

6 голосов
/ 29 марта 2011

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

Дальнейшее уточнение

Представьте, что у него есть несколько модулей, которые одновременно нуждаются в одном соединении? Изображение одновременно работает элементы управления, требующие подключения. Что он собирается делать? Есть глобальный объект подключения? Использовать шаблон Singleton? Скажи мне, если я не прав

1 голос
/ 14 декабря 2016

Я только начал задавать себе этот же вопрос.Как и вы, это всего лишь одно приложение, и я не беспокоюсь об отсутствии соединений.

Однако я столкнулся с потенциальной проблемой, когда оставляю базу данных открытой: транзакции.Если вы делаете BEGIN TRANSACTION и возникает ошибка или что-то еще происходит, когда ваш код не достигает COMMIT или ROLLBACK, то вы оставляете эту транзакцию открытой.

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

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

1 голос
/ 29 марта 2011

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

1 голос
/ 29 марта 2011

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

Теперь, если вам нужно выполнить множество запросов для извлечения данных, открытие закрывающего соединения для каждого запроса может быть довольно дорогим, поэтому стоит оставить соединение открытым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...