如何提高SQLite连接的效率

时间:2014-10-09 10:10:27

标签: android sqlite android-sqlite

在活动运行的整个时间内保持本地sqlite连接打开是否有任何优势?

我通常会创建一个新连接,然后在执行数据库操作的每个方法中关闭它。它看起来像这样:

myMethod(Context context){
    LocalDBHelper localDBHelper = new LocalDBHelper(context); //extended SQLiteOpenHelper 
    SQLiteDatabase db = localDBHelper.getWritableDatabase();
    ...
    localDBHelper.close();
}

因此,在典型的用户会话中,这将发生大约10次。在onResume()中创建连接是否有意义,在所有数据库访问方法中使用它,最后在onPause()中关闭它?

4 个答案:

答案 0 :(得分:1)

由于您的应用程序在每次连接时都在同一台计算机上工作,并且每次都访问相同的内存,因此将它打开是没有问题的。因为在相同的内存空间中,sqlite只是像主DLL一样加载主应用程序。

可能只会出现一个问题!当你想同时运行许多线程来访问数据库时(例如使用AsyncTask),它们之间的干扰迫使一些线程停止!所以最好每次都为新线程建立连接!

答案 1 :(得分:1)

  

在活动运行的整个时间内保持本地sqlite连接打开是否有任何优势?

您通常希望在整个过程中都有一个“连接”。特别是,您不希望在多个线程中同时使用多个“连接”。 Android中SQLite的所有线程安全逻辑都是基于对所有这些线程使用单个SQLiteDatabase(因此,单个SQLiteOpenHelper),因此可以进行正确的锁定。

答案 2 :(得分:1)

根据@CommonsWare的回答,我已经使用延迟实例化实现了一个Singleton模式,以便拥有LocalDBHelper的单个应用程序范围实例。到目前为止它工作正常,并且无需为每个操作实例化和关闭帮助器/数据库。

public class MyApplication extends Application{
    private static MyApplication instance;
    public MyApplication(){
        instance = this;
    }
    public static Context getContext(){
        return instance;
    }
}

public class LocalDBHelper extends SQLiteOpenHelper{
    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "MyDB";
    private static final String LOG_TAG = "LocalDBHelper";

    private static LocalDBHelper instance = null;
    /*private constructor to avoid direct instantiation by other classes*/
    private LocalDBHelper(){
        super(MyApplication.getContext(), DATABASE_NAME, null, DATABASE_VERSION);
    }
    /*synchronized method to ensure only 1 instance of LocalDBHelper exists*/
    public static synchronized LocalDBHelper getInstance(){
        if(instance == null){
            instance = new LocalDBHelper();
        }
        return instance;
    }
    ...
    ...
}

用法:

SQLiteDatabase db = LocalDBHelper.getInstance().getWritableDatabase();
db.insert(...)

用于交易:

SQLiteDatabase db = LocalDBHelper.getInstance().getWritableDatabase();
db.beginTransaction();
try{
....
...
db.setTransactionSuccessful();
}catch(Exception e){
    e.printStackTrace();
}
finally{
    db.endTransaction();

}

重要提示:无需在任何地方致电localDBHelper.getInstance().close()

答案 3 :(得分:0)

我个人觉得更容易调用初始应用程序加载所需的SQL连接,存储到SQLite数据库中,并为用户设置刷新按钮以决定何时刷新数据,或者为应用程序设置定期更新间隔计时器。

通过这种方式,您可以通过将数据加载置于预定义/用户定义的时间来提高应用程序的一般使用期间的性能。

虽然我认为这取决于DB Interaction的执行频率....

这个问题可能会为您提供一些有用的答案:

Should I open() and close() my SQL database constantly or leave it open?