java - Android SQL 数据库打开和关闭 - 竞争条件

标签 java android mysql multithreading

我有一个相当复杂的应用程序,它从各种后台线程和服务读取和写入数据库。有时(不幸的是经常)我会因

崩溃

attempt to re-open an already-closed object

java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed.

我已经阅读了有关此主题的一些问题,一般建议包括根本不关闭数据库连接、关闭/打开 onCreate/onResume、在应用程序中关闭/打开、在需要执行操作时关闭/打开对数据库等的操作

我尝试的最后一件事是将所有打开/关闭移动到与数据库对象一起使用的实际方法中。这减少了错误的频率,但是当从不同的线程访问两种不同的方法时,我仍然遇到问题,两种方法都打开数据库,但当第二个方法即将运行查询并期望打开数据库时,其中一个方法会关闭连接.

我知道我可以在一个公共(public)锁对象上进行同步,因为包含所有数据库访问方法的数据库管理器类是一个单例,但是仅针对打开/关闭这样做感觉很糟糕。

有什么建议吗?

最佳答案

如果您不想同步数据库方法,请维护打开和关闭方法调用数量的计数,如下所示。

int count=0;

openDb(){
  if(db==null){
        //Open the db
   }
   count++;
}

public void closeDb(){
        count--;
        if(count==0){
            //close the db
        }
}

关于java - Android SQL 数据库打开和关闭 - 竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30303932/

相关文章:

java - 用于具有 2D 逻辑的 3D 游戏的 Libgdx scene2d?

java - GAE/J 数据存储 : storing null vs missing values

java - 为什么 JavaFX 中的最终类 WebView 包含 protected 方法 getChildren()?

java - 如何从android中的AsyncTask获取数据?

MySQL 全文搜索查询缺失结果

mysql - 使用MySQL从一行中的两个表中检索数据

Java 编译器错误 : "public type .. must be defined in its own file"?

java - 来自子布局的 recyclerView 引用,包含在父布局中的 <include/>

java - 使用Gson解析以下字符串

PHP/MYSQL - 在插入新记录之前检查是否有重复记录