psycopg2与服务器断开连接
我一直在解决这个问题。我安装了一台全新的机器。我安装了一个新的postgresql和所有其他依赖关系。基本上,我随机获取这些数据库断开连接。我可以执行相同的请求,它可以工作,也可以不工作。外观非常不确定。在Postgresql上看日志,它甚至没有连接。现在,我希望如果它从来没有连接过,当建立连接并获取游标时,我会遇到这个问题,但是当我试图在以后实际使用连接时得到它。鉴于下面的回溯,我希望看到在pg日志中建立的连接,然后由于某种原因断开连接。我不知道,所以我想知道这种不匹配是否有一些线索。psycopg2与服务器断开连接
Traceback (most recent call last):
File "/usr/local/lib/python2.6/dist-packages/Django-1.1-py2.6.egg/django/core/handlers/wsgi.py", line 242, in __call__
response = self.get_response(request)
File "/usr/local/lib/python2.6/dist-packages/Django-1.1-py2.6.egg/django/core/handlers/base.py", line 73, in get_response
response = middleware_method(request)
File "/usr/local/lib/python2.6/dist-packages/Django-1.1-py2.6.egg/django/middleware/locale.py", line 16, in process_request
language = translation.get_language_from_request(request)
File "/usr/local/lib/python2.6/dist-packages/Django-1.1-py2.6.egg/django/utils/translation/__init__.py", line 97, in get_language_from_request
return real_get_language_from_request(request)
File "/usr/local/lib/python2.6/dist-packages/Django-1.1-py2.6.egg/django/utils/translation/trans_real.py", line 349, in get_language_from_request
lang_code = request.session.get('django_language', None)
File "/usr/local/lib/python2.6/dist-packages/Django-1.1-py2.6.egg/django/contrib/sessions/backends/base.py", line 63, in get
return self._session.get(key, default)
File "/usr/local/lib/python2.6/dist-packages/Django-1.1-py2.6.egg/django/contrib/sessions/backends/base.py", line 172, in _get_session
self._session_cache = self.load()
File "/usr/local/lib/python2.6/dist-packages/Django-1.1-py2.6.egg/django/contrib/sessions/backends/db.py", line 16, in load
expire_date__gt=datetime.datetime.now()
File "/usr/local/lib/python2.6/dist-packages/Django-1.1-py2.6.egg/django/db/models/manager.py", line 120, in get
return self.get_query_set().get(*args, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/Django-1.1-py2.6.egg/django/db/models/query.py", line 300, in get
num = len(clone)
File "/usr/local/lib/python2.6/dist-packages/Django-1.1-py2.6.egg/django/db/models/query.py", line 81, in __len__
self._result_cache = list(self.iterator())
File "/usr/local/lib/python2.6/dist-packages/Django-1.1-py2.6.egg/django/db/models/query.py", line 238, in iterator
for row in self.query.results_iter():
File "/usr/local/lib/python2.6/dist-packages/Django-1.1-py2.6.egg/django/db/models/sql/query.py", line 287, in results_iter
for rows in self.execute_sql(MULTI):
File "/usr/local/lib/python2.6/dist-packages/Django-1.1-py2.6.egg/django/db/models/sql/query.py", line 2369, in execute_sql
cursor.execute(sql, params)
File "/usr/local/lib/python2.6/dist-packages/Django-1.1-py2.6.egg/django/db/backends/util.py", line 19, in execute
return self.cursor.execute(sql, params)
OperationalError: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
这是一个非常类似的问题的一个张贴在这里:
Django + FastCGI - randomly raising OperationalError
我想答案是相同的,如果当有人终于理解了它既能。同样的问题一直困扰着我大约一个月,我不知道是什么原因造成的。
今天早些时候终于指出了这一点,并计划自己从这里链接到它。这是一个真正的问题,很明显,我们中有很多人遇到了这个问题,但要证据和查找信息可能非常困难。谢谢你的提示。 – ironfroggy 2009-10-17 02:08:47
你fork()
子进程(使用preforked FastCGI的或类似的东西)?这可能是在父进程中建立的连接在孩子中不起作用的原因。如果使用preforked方法,则很容易切换到线程以查看问题是否消失。在这种情况下,我看到了完全相同的浮动错误。
虽然我正在使用preforked fastcgi后端,但在子进程中,每个请求都建立了连接。而且,如果像这样的情况出现,我会期望问题更具可预测性,而实际上这些请求通常会成功,而失败则表面上是不确定的。 – ironfroggy 2009-10-15 17:44:34
当子错误继承套接字描述符并向其发送数据时,任何子节点(此节点或其他节点)都可以接收到响应。这会导致错误浮动。我建议添加日志记录以确保连接在fork后被初始化。由于在Django中广泛使用全局变量,所以早期连接建立可以隐藏起来。请注意,在fork之前导入的整个代码。 – 2009-10-15 19:32:53
我已经登录确定这一点。该连接仅在请求时,在孩子中响应于启动请求信号进行。在发送该请求以触发连接之前,子进程已经建立。 – ironfroggy 2009-10-15 20:43:52
即使这是非常古老的问题, 我发现最佳解决方案是在this答案。 只是做到以下几点:
from django import db
和调用fork或使用多执行前:
db.connections.close_all()
我觉得你的问题的部分解决方案可以在这里找到:http://stackoverflow.com/a/33128806/2144966 – Kalle 2015-10-14 15:00:18