Лучшее место для подключения к базе данных
Я искал какое-то время для ответа на мой вопрос, но я не получил то, что мне нужно. У меня есть приложение с ListView и форма, где я могу добавить новую запись в БД. Поэтому запросов не так много.
Как обрабатывать соединения с db? Должен ли я закрыть его после получения того, что я хочу, или я должен держать его открытым все время, пока приложение не будет закрыто? Я хочу знать, что лучше всего, думая о производительности и времени автономной работы.
Ответы
Ответ 1
В соответствии с этот пост инженером Google (Dianne Hackborn), нет ничего плохого в том, что вы не открываете соединение с базой данных:
Android сделал преднамеренное дизайнерское решение, которое может показаться неожиданным, просто отказаться от всей идеи приложений, выходящих чисто вместо этого ядро очистит свои ресурсы. В конце концов, Ядро должно быть в состоянии сделать это в любом случае. Учитывая, что дизайн, хранение все, что открыто для всего процесса жизненного цикла и никогда не закрывает его, просто не является утечкой. Он будет очищен, если процесс очищается.
Итак, для простоты я бы расширил класс Application, чтобы обеспечить единую четко определенную точку входа для вашего кода и открыть соединение с базой данных в onCreate()
. Храните соединение с БД в качестве поля в приложении и предоставляйте метод доступа, чтобы сделать доступным соединение для остальной части вашего кода.
Тогда не беспокойтесь о его закрытии.
Ответ 2
Установление подключения к базе данных дорого. Если соединений не хватает, а база данных локальная, я бы сохранил соединение открытым, а не устанавливал его для каждой операции записи в базу данных, как это обычно бывает в клиент-серверном приложении, которое необходимо масштабировать до для размещения большого количества одновременных пользователей.
Ответ 3
В общем, я бы закрыл соединение в функции 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();
}
}