【发布时间】:2013-10-09 20:03:34
【问题描述】:
我正在使用一个简单的 sqlite DB 作为进程之间的持久性消息队列机制。为了在超过一定限制后减小文件大小,我想使用“vacuum”命令。一般来说,这一切都很好,只是我在清理时时不时收到“数据库已锁定”错误。
在阅读了网络上的各种资源后,我了解到在 sqlite 级别上我无能为力。
但是,除了附带问题“为什么会这样?使用常规的 busyHandler 机制重试获取所需的锁会有什么问题?”我想出了在应用程序级别实现完全相同的busyHandler机制的想法。
现在是基本问题:这有什么问题吗?
非常感谢!!
【问题讨论】:
-
SQLite 自动重用已释放的数据库页面,因此文件大小最终将保持不变。你不需要
VACUUM,除非你真的知道数据总量会变小并且未来不会增加。 -
true,但在我的场景中(作为 msg 队列),我必须支持诸如最大队列大小之类的东西。所以如果我超过了这个,我就不能再写入数据库了——即使数据库同时是完全空的(因为读者现在已经消耗了所有的味精)。嗯,除非我能确定实际的实际数据量(而不仅仅是文件大小)......会考虑......