【问题标题】:Best place to close database connection关闭数据库连接的最佳位置
【发布时间】:2011-09-30 07:29:08
【问题描述】:

我一直在寻找我的问题的答案,但我没有得到我需要的东西。我有一个带有 ListView 的应用程序,以及可以向 DB 添加新记录的表单。所以没有太多的查询要做。

如何处理与 db 的连接?我应该在得到我想要的东西后关闭它还是应该一直打开它直到应用程序关闭?在考虑性能和电池寿命时,我想知道什么是最佳方式。

【问题讨论】:

标签: android database sqlite


【解决方案1】:

建立与数据库的连接是昂贵的。如果连接不短缺,并且数据库是本地的,我会保持连接打开,而不是为每个对数据库的写入操作建立连接,就像您通常在需要扩展到的客户端-服务器应用程序中所做的那样容纳大量并发用户。

【讨论】:

  • 是的,我发现打开可能很昂贵。因此,如果我对您的理解很好,我应该保持连接打开。但是,如果用户将转到主屏幕怎么办。我应该在 onPause() 中关闭它并在 onResume() 中再次打开吗?如何在 Intent 之间传递它?
【解决方案2】:

一般来说,我会在打开连接的 Activity 的 onDestroy() 函数中关闭连接。我会在使用游标的函数中关闭()来自数据库的游标。

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();
    }
}

【讨论】:

    【解决方案3】:

    根据this post by a Google engineer (Dianne Hackborn)的说法,保持数据库连接打开没有什么问题:

    Android 做出了一个深思熟虑的设计决定,这似乎令人惊讶, 放弃应用程序干净退出的整个想法 而是让内核清理他们的资源。毕竟, 无论如何,内核都需要能够做到这一点。鉴于该设计,保持 任何东西在进程的整个生命周期内打开并且从不关闭它根本不是泄漏。到时候会清理干净 进程已清理。

    因此,为简单起见,我将扩展 Application 类,为您的代码提供一个定义明确的入口点,并在其 onCreate() 中打开数据库连接。将数据库连接作为字段存储在您的应用程序中,并提供访问器方法以使该连接可用于您的其余代码。

    那么,不要担心关闭它。

    【讨论】:

    • 对于 quik fix,这是一个很好的答案,但通过制定良好的程序流程并首先进行规划,这可能会做得更好。
    • @JānisGruzis 怎么会有任何替代方案比总是有效且非常简单的东西“更好”?
    • @JānisGruzis 是Android所基于的Linux内核的一个功能;当一个进程(即您的应用程序)终止时,操作系统将清理 所有未持久化的内容(例如到磁盘):回收所有内存,关闭所有句柄等。话虽如此,我更喜欢对生命“明确”..
    • 考虑到 getWritableDatabase() 上的文档,这似乎有点奇怪:Create and/or open a database that will be used for reading and writing...Once opened successfully, the database is cached, so you can call this method every time you need to write to the database. (Make sure to call close() when you no longer need the database.)
    • @Mahm00d 并且您绝对确定“不再需要数据库”的时间点是您的应用程序被操作系统关闭时。因此,让操作系统为您处理它。 :)
    猜你喜欢
    • 1970-01-01
    • 2019-03-09
    • 2022-01-23
    • 2020-10-24
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多