Когда закрывать соединение дб на андроиде?Каждый раз после завершения вашей операции или после выхода из приложения - PullRequest
43 голосов
/ 30 января 2011

У меня есть приложение для Android, которое часто обращается к локальному sqlite3 db, из соображений производительности, поэтому я всегда держу соединение открытым. Но один из моих друзей рекомендовал мне открывать / закрывать соединение при каждой операции.

1) Что вы думаете по поводу этих двух методов? минусы / плюсы. 2) Я провел некоторое тестирование и обнаружил, что соединение с БД не требует слишком больших накладных расходов. Разница в производительности при подключении к БД зависит от размера БД?

Ответы [ 4 ]

33 голосов
/ 30 января 2011

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

Вы много раз «повторно запрашиваете» базу данных? Тогда кажется исправленным, чтобы он оставался открытым.

Вы получаете разные данные каждый раз, когда что-то получаете? Опять же, кажется разумным оставить его открытым (поскольку вместо этого вы не выиграете в кэшировании данных).

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

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

6 голосов
/ 07 февраля 2012

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

Возможно, это немного необычный случай, но он просто застал меня врасплох.

2 голосов
/ 19 мая 2017

В документации сказано, что соединение может быть открыто столько, сколько вам нужно. И может быть закрыт в методе onDestroy (). Ссылка на документацию

Постоянное соединение с базой данных:

Поскольку getWritableDatabase () и getReadableDatabase () дороги для звоните, когда база данных закрыта, вы должны покинуть базу данных Соединение открыто до тех пор, пока вам, возможно, потребуется доступ к нему. Как правило, оптимально закрыть базу данных в onDestroy () Активность вызова.

    @Override
    protected void onDestroy() {
        mDbHelper.close();
        super.onDestroy();
    }
1 голос
/ 06 января 2016

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

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

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