Лучшее место, чтобы закрыть соединение с базой данных

Я некоторое время искал ответ на свой вопрос, но не получил того, что мне нужно. У меня есть приложение с ListView, и форма, где я могу добавить новую запись в БД. Так что запросов не так много.

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

3 ответа

Согласно этой записи инженера Google (Дайан Хэкборн), нет ничего плохого в том, чтобы оставить соединение с базой данных открытым:

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

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

Тогда не беспокойтесь о его закрытии.

В общем, я бы закрыл соединение в функции onDestroy() Activity, которая открыла соединение. Я бы закрыл () курсор из базы данных в функции, которая использует курсор.

public MyActivity extends Activity{
    private myDatabase mDatabase; // myDatabase extends SQLiteOpenHelper
    private Cursor mCursor;

    public MyActivity(Context context){
        super(context);
        initMemberVariables();
    }

    public ElementButton(Context context, AttributeSet attrS){
    super(context, attrS);
        initMemberVariables();
    }

    public ElementButton(Context context, AttributeSet attrS, int defStyle){
        super(context, attrS, defStyle);
        initMemberVariables();
    }

    private void initMemberVariables(){
        mDatabase = new PSEdb(this.getContext());
    }

    private void getData(){
        mCursor = mDatabase.MyGetterFunction();
        while(mCursor.moveToNext()){
            try{
                // populate your data
            }catch(CursorIndexOutOfBoundsException ex){
                // handle the exception
            }
        }
        mCursor.close();
    }

    @Override
    public void onDestroy(){
        super.onDestroy();
        mDatabase.close();
    }
}

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

Другие вопросы по тегам