Лучшее место, чтобы закрыть соединение с базой данных - PullRequest
53 голосов
/ 07 июля 2011

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

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

Ответы [ 3 ]

108 голосов
/ 12 октября 2011

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

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

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

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

4 голосов
/ 07 июля 2011

В общем, я бы закрыл соединение в функции 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();
    }
}
4 голосов
/ 07 июля 2011

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

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