我有一个应用程序,它有大量的数据库活动。我不时地得到SQLite‘数据库被锁定’的错误,导致SQLiteExceptions。当我试着用:
if((!db.isDbLockedByCurrentThread())&&(!db.isDbLockedByOtherThreads())) {在使用“保存”或“插入”之前,但这尚未成功。所以,我在一堂课上设置了以下内容。MyApplication,它像这样扩展应用程序:
private AtomicBoolean writingToDataBaseFlag = new AtomicBoolean(false);带着一个访问者:
public AtomicBoolean getWritingToDataBaseFlag() {
return writingToDataBaseFlag;
}每当我想要执行插入或保存时,我都会执行如下操作:
boolean succeeded = false;
while(!succeeded) {
if(application.getWritingToDataBaseFlag().compareAndSet(false, true)) {
if((!db.isDbLockedByCurrentThread())&&(!db.isDbLockedByOtherThreads())) {
if(!activity.isFinishing()) {
set_id(db.insert(SDIGENRE, SDIID, cv));
}
}
application.getWritingToDataBaseFlag().compareAndSet(true, false);
succeeded = true;
} else {
// Wait 100 millis
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}这似乎已经有相当一段时间了。
谢谢你的帮助朱利叶斯。
发布于 2012-08-15 22:40:17
最后,我的DbHelper (SQLiteOpenHelper)只有一个实例绑定到我的应用程序中。通过进行所有的调用,我从来没有任何并发问题。
发布于 2014-11-20 11:24:57
好吧,我可以获得信息。并找到一篇关于线程操作数据库的有趣文章。
在android中,said : isDbLockedByOtherThreads()在API 16之后被弃用,总是返回false。不要使用这种方法。
因此,问题来自于isDbLockedByCurrentThread();
android提到了这个方法:
如果当前线程持有到数据库的活动连接,则返回true。
此方法的名称来自与数据库的活动连接意味着线程在数据库上持有实际锁的时间。现在,不再存在真正的“数据库锁”,尽管如果线程无法获得执行特定操作的数据库连接,则可能会阻塞。
实际上,当您插入、删除、修改android框架中的sqlitedatabase时,它都是关于单个线程的。这意味着当您使用两个或多个线程操作(插入、删除、修改) sqlitedatabase时,它将抛出‘数据库被锁定’的错误;
但是您可以打开多线程来排队同一个sqlitedatabase,它不会有任何问题。
顺便说一句,如果您在处理插入时想要队列,则应该使用
getWritableDatabase().enableWriteAheadLogging();它只在Android3.0或更高版本上工作;
也许你应该读这篇文章(如果你能读中文,哈哈):http://tech.techweb.com.cn/thread-621414-1-1.html
https://stackoverflow.com/questions/5973799
复制相似问题