将Django 1.6应用程序升级到Django 1.7后,从PostgreSQL获取数据时开始出现随机错误:

DatabaseError: server sent data ("D" message) without prior row description ("T" message)
lost synchronization with server: got message type "�", length -1244613424

DatabaseError: lost synchronization with server: got message type "0", length 842674226

ProgrammingError: no results to fetch

ValueError: invalid literal for int() with base 10: 'feuj3f47jvsdv7tgnj43g63j'

当我在浏览器中快速打开10个选项卡时,一半的选项卡正常加载,其中一半出现DB错误。当我刷新发生错误的选项卡时,它们会正常加载。

我正在通过uwsgi和nginx运行Django,psycopg2的版本是2.5.4。

总体而言,与Postgres的交流似乎完全中断了,并且不同查询的结果混杂在一起。

编辑:

经过数小时的故障排除后,我发现了以下内容:

Django 1.6 + uwsgi-作品
Django 1.7 + Gunicorn-工程
Django 1.7 + uwsgi-不起作用,抛出数据库错误。因此,问题似乎出在特定于uwsgi和Django 1.7的结合上。奇怪的是,我有另一个Django 1.7项目在具有相同uwsgi的同一服务器上运行,并且没有问题。

有任何想法吗?

(我真的不介意切换到Gunicorn,可能必须采用这种方式,但这仍然很有趣,为什么会发生这种情况)

更新2:仔细检查会发现Django内部发生了完全疯狂的事情,例如模型的主键被当前用户的session_id替换(这是“无效的原语(以int()为基数为10)的错误”的来源),并且Django向DB发出查询“忘记了以指定WHERE子句。我可能会称其为某种内存损坏。

更新3:我们从uwsgi切换到gunicorn,问题现在消失了。一切正常。我可能仍在寻找合适的解决方案。

最佳答案

我认为lazy-apps=true应该可以解决问题。从uwsgi文档中:



如果不打开lazy-apps,则工作进程将共享内存,并且很有可能破坏内存:



当涉及到连接和其他东西时,不设置lazy-apps是很危险的。

缺点是每个工作人员都会有一个完整的连接池(如果正在建立连接池),并且最终可能会使用很多连接。

我不是python专家,但我认为可以使用gevent之类的方法来集中处理连接池。然后,您甚至可能不需要lazy-apps

关于django - Django 1.7,uwsgi和PostgreSQL的随机数据库错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26273328/

10-16 21:43
查看更多