Eve*_*eys 10 database sqlite android locked android-contentprovider
我有一个应用程序(Android 2.2 Google API Level 8),它有多个活动从内容提供商提取数据(仅限SELECT数据库访问).它还有一个服务,中央阻塞任务队列接受任何数据库写入任务; 活动可以触发服务请求(作为意图),该请求将任务放在阻塞队列上,以便由单个线程和执行进行顺序检索.数据库大约4mb.
有一个数据库助手,服务使用它来调用与数据库交互的方法,包括写入数据库; 所有SQL写入都在数据库助手中执行.
在执行任务执行期间,在尝试写入由"begin transaction"的任务执行触发的数据库时,我始终遇到一个或两个"数据库被锁定"错误.
在尝试跟踪锁的来源时,我发现使用dbhelper.inTransaction(),dbhelper.isLockedByThisThread(),dbhelper.isLockedByOtherThread()没有帮助,因为它们不会指示意外的数据库锁.
我发现在早期检测锁定时工作的是创建一个带有beginTransaction()和setTransactionSuccessful的方法,而没有任何实际的SQL编写代码,在一个可以记录问题的try catch块中 - 总是由beginTransaction()触发.
我把这个数据库锁定陷阱放在每个阻塞队列任务方法的任何一侧,期望/希望我找到一个单一的罪魁祸首,在完成后将数据库保持在锁定状态.我找不到一致的罪魁祸首.在从任务调用开始向下钻取到数据库写入之后,我发现数据库锁可能看起来很突然而没有被先前运行的任务锁定(所有这些任务在相同的单一线程下按顺序运行).
在查看了许多其他人对数据库锁定问题的经验之后,我已经尝试在事务完成所有任务后直接关闭数据库连接但这没有帮助,如果有什么似乎有更多的数据库锁定发生.尝试在每个任务执行之间添加睡眠; 没有详尽的测试,但一般发现延迟3秒或以上似乎停止出现数据库锁.尝试禁用警报管理器解雇任务 - 没有任何区别.
我的印象是我的应用程序外部的某种形式的维护任务正在进入并定期锁定数据库 - 可能会延迟写入日志.显然,我不太热衷于设置任务处理延迟,因此我正在考虑使用数据库锁重试任务队列来根据需要重新尝试数据库写入; 我更喜欢解决但却没有想法.
任何人都可以想到我错过了一些原则或陷阱吗?
在Android和更大的SQLite数据库中,您是否会偶尔获得数据库锁定?
谢谢
只要您使用单个数据库连接,SQLite就可以保证从多个线程进行顺序访问.您打开和关闭数据库连接的方式和位置?
我通常建议在启动时打开数据库一次,永远不要关闭它.关闭没有任何好处,因为SQLite的事务性质意味着无论如何都要尽快将写入刷新到持久存储.