Когда нужно закрыть соединение db на Android? Каждый раз после завершения операции или после выхода приложения

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

Возможно, это был крошечный крен, но он меня просто поймал.

Ответ 3

В качестве дополнения открытие и закрытие соединения настолько часто может привести к тому, что вы столкнетесь с известными исключениями SQLite, если вы получите доступ к db из нескольких потоков.

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

Ответ 4

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

Постоянное подключение к базе данных:

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

    @Override
    protected void onDestroy() {
        mDbHelper.close();
        super.onDestroy();
    }