SQLITE3数据库被锁定Django和Celery

时间:2016-02-10 08:00:13

标签: python django sqlite

我们有一个传统的django应用程序(django 1.4.2)正在运行以发布一些报告。它使用芹菜和sqlite3。由于多个并发连接,sqlite数据库被锁定。

这些应用程序是在大约四年前编写的,并且除了偶尔的数据库锁定之外,它的工作非常好,这种情况正在变得很痛苦。升级到较新版本的Django假设设置CONN_MAX_AGE(在django 1.6中引入)将正常工作被推翻,因为应用程序相当大并且可能存在一些依赖性问题。

请注意,这不是Web前端应用程序,内部用户少于30个。因此,安全性不是一个大问题。

问题是我们如何确保数据库不被锁定。有没有办法为旧版本的django实现CONN_MAX_AGE。

1 个答案:

答案 0 :(得分:1)

您应该更改为使用更好地支持多个连接的数据库,例如postgres或mysql,sqlite实际上并不是为了实现这一目标而构建的,并且更多地用于开发非常罕见的开发人员有多个并发连接

您可以在django文档中找到有关锁定错误的更多信息 - useful security tools

  

如果您收到此错误,可以通过以下方式解决:

     
      
  • 切换到另一个数据库后端。在某个时刻,SQLite对于真实世界的应用程序来说太“精简”了,而这些并发错误表明你已经达到了这一点。

  •   
  • 重写代码以减少并发性并确保数据库事务是短暂的。

  •   
  • 通过设置timeout database选项选项来增加默认超时值:

  •   

注意到这仅适用于> = django 1.8

除此之外,如果您使用postgres,您发现自己可以使用更多django查询集方法,“Database is locked” errorsmodel fields