【发布时间】:2011-02-05 15:04:53
【问题描述】:
我确定我遗漏了一些非常明显的东西,但我无法终生阻止我的 pysqlite 脚本因数据库被锁定错误而崩溃。我有两个脚本,一个用于将数据加载到数据库中,一个用于读取数据,但两者都会频繁且立即崩溃,具体取决于另一个在任何给定时间对数据库执行的操作。我将两个脚本的超时设置为 30 秒:
cx = sqlite.connect("database.sql", timeout=30.0)
并且认为我可以看到一些超时的证据,因为我得到了一个似乎是时间戳的东西(例如 0.12343827e-06 0.1 - 我如何阻止它被打印出来?)偶尔在我的诅咒中间倾倒格式化的输出屏幕,但在 30 秒超时附近没有任何延迟,但另一个仍然会因此一次又一次地崩溃。我在 64 位 4 CPU HS21 IBM 刀片上运行 RHEL 5.4,并且听说过一些关于多线程问题的提及,但不确定这是否相关。使用的软件包是 sqlite-3.3.6-5 和 python-sqlite-1.1.7-1.2.1,升级到 Red Hat 官方规定之外的新版本对我来说不是一个好选择。可能,但由于一般环境的原因并不理想。
我之前在这两个脚本中都有autocommit=1,但后来都禁用了,现在我在插入脚本上cx.commit()ing,而不是在选择脚本上提交。最终,因为我只有一个脚本实际上进行了任何修改,所以我真的不明白为什么会发生这种锁定。我注意到,随着时间的推移,当数据库变得更大时,情况会变得更糟。它最近是 13 MB,有 3 个大小相同的表,大约是 1 天的数据量。创建一个新文件显着改善了这一点,这似乎可以理解,但最终似乎并没有遵守超时。
非常感谢任何指针。
编辑:自从询问以来,我已经能够稍微重构我的代码并使用信号在每 5 秒一次事务中定期写入 0 到 150 次更新。这显着减少了锁定的发生,与每分钟左右一次相比,每小时少于一次。我想我可以通过确保在读取其他脚本中的数据时将写入数据的时间偏移几秒钟来走得更远,但基本上我正在解决一个问题,因为我认为它不需要超时,这并不似乎还是不对。塔。
【问题讨论】:
标签: python database sqlite locked