Лучшее место, чтобы закрыть соединение с базой данных
Я некоторое время искал ответ на свой вопрос, но не получил того, что мне нужно. У меня есть приложение с 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();
}
}
Установление соединения с базой данных стоит дорого. Если не хватает соединений, а база данных является локальной, я бы оставил соединение открытым, а не устанавливал бы его для каждой операции записи в базу данных, как вы обычно делаете в клиент-серверном приложении, которое необходимо масштабировать до разместить большое количество одновременно работающих пользователей.