我们有一个传统的django应用程序(django 1.4.2)正在运行以发布一些报告。它使用芹菜和sqlite3。由于多个并发连接,sqlite数据库被锁定。
这些应用程序是在大约四年前编写的,并且除了偶尔的数据库锁定之外,它的工作非常好,这种情况正在变得很痛苦。升级到较新版本的Django假设设置CONN_MAX_AGE(在django 1.6中引入)将正常工作被推翻,因为应用程序相当大并且可能存在一些依赖性问题。
请注意,这不是Web前端应用程序,内部用户少于30个。因此,安全性不是一个大问题。
问题是我们如何确保数据库不被锁定。有没有办法为旧版本的django实现CONN_MAX_AGE。
答案 0 :(得分:1)
您应该更改为使用更好地支持多个连接的数据库,例如postgres或mysql,sqlite实际上并不是为了实现这一目标而构建的,并且更多地用于开发非常罕见的开发人员有多个并发连接
您可以在django文档中找到有关锁定错误的更多信息 - useful security tools
如果您收到此错误,可以通过以下方式解决:
切换到另一个数据库后端。在某个时刻,SQLite对于真实世界的应用程序来说太“精简”了,而这些并发错误表明你已经达到了这一点。
重写代码以减少并发性并确保数据库事务是短暂的。
通过设置timeout database选项选项来增加默认超时值:
注意到这仅适用于> = django 1.8
除此之外,如果您使用postgres,您发现自己可以使用更多django查询集方法,“Database is locked” errors和model fields