【问题标题】:When to close db connection on android? Every time after your operation finished or after your app exit什么时候关闭android上的数据库连接?每次操作完成或应用退出后
【发布时间】:2026-02-10 05:30:02
【问题描述】:

我有一个经常访问本地 sqlite3 数据库的 android 应用程序,出于性能考虑,所以我始终保持连接打开。但是我的一位朋友建议我每次操作都打开/关闭连接。

1) 你们对这两种方法有什么看法?缺点/优点。 2)我做了一些测试,发现数据库连接没有太多的性能开销。 DB连接的性能开销是否因DB的大小而异?

【问题讨论】:

  • 有一个妥协,我想说,每次数据库操作的活动,而不是应用程序本身,都死了?!
  • 也许是一个更好的答案:除非必须,否则不要关闭它。 *.com/a/7739454/423105

标签: android database sqlite connection


【解决方案1】:

我不知道频繁关闭/打开数据库(无论其大小)有什么性能损失。我认为这个问题的答案还取决于访问数据库的应用程序类型。

您是否经常“重新查询”数据库?
然后它似乎纠正了保持打开状态。

您每次获取数据时是否获取不同的数据?
同样,将其保持打开状态似乎是合理的(因为您不会获得缓存数据的好处)。

是否有其他应用程序访问同一数据库?
如果存在并发或阻塞问题的风险,在完成读取/写入数据库后关闭数据库可能是明智之举。

通常我会说,在优化性能时,缓存数据可能比保持数据库打开(相反关闭它)获得更多。

【讨论】:

  • 感谢 dbm。我的应用程序是唯一访问数据库的应用程序,它进行了很多重新查询。对我来说,始终保持数据库打开是更好的选择。但是您能否更具体地了解“缓存数据”的性能提升,我不太确定 sqlite 数据库在地下做了什么。
  • 我假设(可能是错误的)您查询数据库,从返回的 Cursor 对象中读取所需的值,然后将其丢弃。下次您需要数据时,您将再次执行相同的过程。现在,假设您检索到的数据的性质不需要您在连续的数据库查询之间刷新它。然后,它可以从数据库中读取一次并将值存储在本地 HashMap 或其他东西中。访问“内存中”数据结构(“缓存”数据)通常比重新查询数据库快得多。
  • 现在有些情况确实需要重新查询数据(因此,缓存不一定是一种选择)。然后看看“索引”可能会很有趣,甚至“准备好的语句”在数据库引擎支持的情况下也会很有趣。这个链接可能也很有趣:web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html
【解决方案2】:

如果您使用的是内存数据库,那么当您关闭连接时,您的数据将被丢弃。

也许有点极端情况,但它让我很着迷。

【讨论】:

  • 这实际上是一个非常好的答案。我最近在使用内存数据库作为缓存基础设施方面获得了成功的经验(我明确地想在退出时丢弃缓存)......
  • 一旦你打开数据库/连接,它已经被缓存了。
【解决方案3】:

此外,如果您从多个线程访问数据库,那么频繁地打开和关闭连接可能会导致您遇到臭名昭著的 SQLite 异常。

看,如果你从多个线程访问数据库,甚至通过一个连接,并且由于这些操作不是原子的,那么你可以尝试更新之前被另一个线程关闭的数据库。

【讨论】:

    【解决方案4】:

    文档说,只要您需要,连接就可以打开。并且可以在 onDestroy() 方法中关闭。 Documentation link

    持久数据库连接:

    由于 getWritableDatabase() 和 getReadableDatabase() 的成本很高 当数据库关闭时调用,你应该离开你的数据库 只要您可能需要访问它,连接就会打开。 通常,最好在 onDestroy() 中关闭数据库 调用活动。

        @Override
        protected void onDestroy() {
            mDbHelper.close();
            super.onDestroy();
        }
    

    【讨论】: