将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/