我在一个cpu上并行运行两个python文件,这两个文件都使用相同的sqlite3数据库。我使用sqlalchemy处理sqlite3数据库,我的理解是sqlalchemy处理一个应用程序中的所有线程数据库问题。我的问题是如何处理来自两个不同应用程序的访问? 我的两个程序之一是一个烧瓶应用程序,另一个是cronjob,它不时更新数据库。 似乎即使是sqlite数据库上的只读任务也会锁定数据库,这意味着如果两个应用程序同时想要读取或写入,我都会收到错误。
OperationalError: (sqlite3.OperationalError) database is locked
让我们假设我的cronjob应用程序每5分钟运行一次。如何确保我的两个应用程序之间没有冲突?我可以将一些读取标志写入我在访问数据库之前检查的文件中,但在我看来应该有一种标准的方法来做到这一点? 此外,我正在使用gunicorn运行我的应用程序,原则上可以运行多个作业...所以我最终希望我的烧瓶应用程序有超过2个并行作业... 谢谢 卡尔
答案 0 :(得分:0)
这是真的。 Sqlite不是为这种应用程序而构建的。 Sqlite实际上适用于轻量级单线程,单实例应用程序。
Sqlite连接是每个实例一个,如果你开始进入某种线程多路复用器(参见https://www.sqlite.org/threadsafe.html)它就有可能,但它比它的价值更麻烦。还有其他解决方案提供该功能 - 看看Postgresql或MySQL。这些数据库是开源的,文档齐全,支持良好,并支持您需要的并发性。
答案 1 :(得分:0)
我不确定SQLAlchemy如何处理连接,但如果您使用的是Peewee ORM,则解决方案非常简单。
当您的Flask应用程序发起请求时,您将打开与该数据库的连接。然后当Flask发送响应时,关闭数据库。
同样,在您的cron脚本中,当您开始使用数据库时打开一个连接,然后在该过程完成时关闭它。
您可能考虑的另一件事是在WAL模式下使用SQLite。这可以提高并发性。打开连接时,可以使用PRAGMA查询设置日记模式。
有关详细信息,请参阅http://charlesleifer.com/blog/sqlite-small-fast-reliable-choose-any-three-/