【问题标题】:Is it possible to lose a SQLite database connection?是否有可能丢失 SQLite 数据库连接?
【发布时间】:2016-03-13 16:41:07
【问题描述】:

我在 Android 应用程序中看到很少有 "java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed." 异常。我在很多地方都没有关闭连接。连接也有可能在其他线程中关闭。

只是为了确定,SQLite 连接是否有可能自动关闭、操作系统关闭或隐式关闭?

【问题讨论】:

  • 这里可能发生的是您的应用程序进程被杀死。如果您的应用程序在后台并且用户忽略它足够长的时间,或者如果 Android 需要资源,或者如果月亮已满,Android 将执行此操作。当用户最终返回您的应用时,Android 会重新创建应用进程并重新实例化仅堆栈中最顶层的 Activity。如果Activity 在正确打开数据库之前尝试访问数据库,您可能会收到此错误(或其他错误)。

标签: java android database sqlite database-connection


【解决方案1】:

是的——任何数据库连接都可以在你背后关闭。如果 dba 决定终止您的连接,它可能发生在服务器端。如果发生超时,它可能会发生在客户端。由于各种原因,它可能发生在 jdbc 内部。它甚至可能在您的代码中偶然发生。

这里有一些模棱两可的地方。您报告无法执行此操作,因为连接已关闭。您的连接池不太可能在您不知情的情况下关闭。此外,如果您正确使用连接池,它会在关闭时重新打开 数据库 连接。

【讨论】:

  • sqlite 数据库没有服务器。你确定这是怎么回事?
【解决方案2】:

我只遇到过几种情况:

  1. 您关闭了与数据库的连接而不是关闭游标

IE:

SQLiteDatabase db = getReadableDatabase();
//Read Operations
//process cursor
db.close(); //closes entire database connection and cursor is invalid throwing an error
  1. 调用活动上下文不再有效

【讨论】:

    【解决方案3】:

    这个source 建议你使用单例DatabaseHelper,还有一些do not demonify it

    这向我表明,数据库不应在您的应用程序的生命周期内简单地自行关闭。

    第一来源@Alex Lockwood

    方法 #1:使用单例实例化 SQLiteOpenHelper

    将您的数据库助手声明为静态实例变量并使用 单例模式来保证单例属性。示例代码 下面应该给你一个关于如何设计的好主意 DatabaseHelper 类正确。

    静态 getInstance() 方法确保只有一个 DatabaseHelper 将永远存在于任何特定时间。如果 sInstance 对象没有 已初始化,将创建一个。如果已经创建了一个 那么它将被简单地返回。你不应该初始化你的助手 对象与新的 DatabaseHelper(context) 一起使用!相反,始终使用 DatabaseHelper.getInstance(context),因为它保证只有一个 数据库助手将存在于整个应用程序的生命周期中。

    第二来源@CommonsWare

    拥有单个 SQLiteOpenHelper 实例有助于处理线程案例。 由于所有线程都将共享公共 SQLiteDatabase, 提供操作同步。

    【讨论】:

      【解决方案4】:

      这是我的个人经历。

      在我将我的代码用于臭名昭著的单例 SQLİteOpenHelper 方法之后,由于帮助对象同步了对该对象的所有数据库访问,事情变得更好了。但是,这还不是最好的。

      你看,所有这些同步的东西都不是真正的原子,它们发生在你没有太多控制权的区域。因此,假设在您查询之前,连接可能已被其他具有锁的线程关闭。

      您可以在查询之前检查连接,但如果它已关闭怎么办?你跳过做你需要做的事?或者您在您拥有控制权的级别为您的特定数据库访问集线器实现简单的同步?我肯定会采取第二种方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-06
        相关资源
        最近更新 更多