是否可能丢失SQLite数据库连接?

时间:2015-12-08 16:43:23

标签: java android database sqlite database-connection

我发现Android应用中很少有"java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed."例外。我没有在许多地方关闭连接。连接也可能在某个其他线程中关闭。

只是为了确保SQLite连接是自动关闭还是由操作系统隐式关闭?

4 个答案:

答案 0 :(得分:4)

source建议您使用单例DatabaseHelper和一些do not demonify it

这表明我不希望数据库在应用程序的生命周期内自行关闭。

第一来源@Alex Lockwood

  

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

     

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

     

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

第二来源@CommonsWare

  

拥有一个SQLiteOpenHelper实例可以帮助处理线程情况。   由于所有线程都将共享公共SQLiteDatabase,   提供了操作同步。

答案 1 :(得分:3)

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

虽然这里有一些含糊之处。您报告无法执行此操作,因为连接已关闭。您的连接池不可能在您不知情的情况下关闭。此外,如果您正确使用连接池,如果它关闭,它将重新打开数据库连接。

答案 2 :(得分:1)

我只是在几个方面遇到过这种情况:

  1. 关闭与数据库的连接,而不是关闭游标
  2. IE:

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

答案 3 :(得分:0)

这是我个人的经历。

在我将代码用于臭名昭着的单例SQLİteOpenHelper方法后,随着辅助对象同步该对象上的所有数据库访问,事情变得更好。但是,它仍然不是最好的。

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

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