我有一个相当复杂的应用程序,它从各种后台线程和服务读取和写入数据库。有时(不幸的是经常)我会因
崩溃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/