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

时间:2015-05-18 13:01:01

标签: java android mysql multithreading

我有一个非常复杂的应用程序,可以从各种后台线程和服务读取和写入数据库。有时候(不幸的是经常)我会遇到崩溃

  

尝试重新打开已关闭的对象

  

java.lang.IllegalStateException:无法执行此操作,因为   连接池已关闭。

我已经阅读了关于这个主题的几个SO问题,一般建议的范围从完全不关闭数据库连接,关闭/打开onCreate / onResume,关闭/打开应用程序,关闭/打开时需要执行对数据库等的操作。

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

我知道我可以在一个公共锁对象上进行同步,因为我的数据库管理器类包括我的所有数据库访问方法都是单例,但是这样做只是为了打开/关闭感觉不好。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

如果您不想同步db方法,请保持打开和关闭方法调用次数的计数,如下所示。

int count=0;

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

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