Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

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

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

Ответ 7

Открытие нового соединения стоит дорого. Поэтому лучший способ использовать соединение - пометить его как неактивное после завершения транзакции. Затем соединение будет возвращено в пул свободных соединений.

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

Когда соединение не закрыто, вы должны правильно обработать соединение в отношении фиксации, отката и т.д.

Проверьте свой язык или рамки. Большинство фреймворков уже поддерживают контейнер незанятых соединений; и поэтому вам не нужно беспокоиться об этом. Некоторые языки также предоставляют эту функциональность из коробки. Например, базовый пакет Golang типа sql.DB поддерживает пул незанятых соединений, которые могут использоваться одновременно, поэтому вам не нужно беспокоиться о закрытии соединения.