0

我正在使用一个简单的 sqlite DB 作为进程之间的持久性消息队列机制。为了在超过一定限制后减小文件大小,我想使用“vacuum”命令。一般来说,这一切都很好,只是我在吸尘时时不时地得到一个“数据库被锁定”的错误。

在阅读了网络上的各种资源后,我了解到在 sqlite 级别上我无能为力。

但是,除了附带问题“为什么会这样?使用常规的 busyHandler 机制重试获取所需的锁会有什么问题?” 我想出了在应用程序级别实现完全相同的busyHandler机制的想法。

现在的基本问题是:这有什么问题吗?

很多谢谢!

4

2 回答 2

0

使用 SQLite 的内置重试机制和自己实现并没有太大区别。但是,编写不需要编写的代码是徒劳的,并且会增加引入错误的机会。

于 2013-10-10T08:13:57.540 回答
0

在又解决了一段时间之后,我通过完全删除清理来更改我的应用程序逻辑,而是使用“pragma max_page_count”来限制数据库大小。唯一需要注意的是,这似乎是特定于会话的,即每次 DB 连接后必须再次设置 pragma。

关于最初的问题:我发现@CL 大部分是正确的 - 吸尘确实涉及标准繁忙的处理程序。在 Linux 上,这也很好地工作,只是在 Windows 上它并不可靠(尽管可能是偶然的,而是由系统速度引起的,......)。在我的自定义busyHandler中使用一点printf()我可以看到它在大多数情况下被调用,但有时它不是并且“pragma Vacuum”只是返回“DB锁定”。可能是由于并发进程试图同时清空(?)......无论如何,重新设计的设计更清洁/更容易。

于 2013-11-05T12:05:33.733 回答