2009-10-15 144 views
8

我一直在解决这个问题。我安装了一台全新的机器。我安装了一个新的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. 
+0

我觉得你的问题的部分解决方案可以在这里找到:http://stackoverflow.com/a/33128806/2144966 – Kalle 2015-10-14 15:00:18

回答

4

这是一个非常类似的问题的一个张贴在这里:

Django + FastCGI - randomly raising OperationalError

我想答案是相同的,如果当有人终于理解了它既能。同样的问题一直困扰着我大约一个月,我不知道是什么原因造成的。

+0

今天早些时候终于指出了这一点,并计划自己从这里链接到它。这是一个真正的问题,很明显,我们中有很多人遇到了这个问题,但要证据和查找信息可能非常困难。谢谢你的提示。 – ironfroggy 2009-10-17 02:08:47

2

fork()子进程(使用preforked FastCGI的或类似的东西)?这可能是在父进程中建立的连接在孩子中不起作用的原因。如果使用preforked方法,则很容易切换到线程以查看问题是否消失。在这种情况下,我看到了完全相同的浮动错误。

+0

虽然我正在使用preforked fastcgi后端,但在子进程中,每个请求都建立了连接。而且,如果像这样的情况出现,我会期望问题更具可预测性,而实际上这些请求通常会成功,而失败则表面上是不确定的。 – ironfroggy 2009-10-15 17:44:34

+0

当子错误继承套接字描述符并向其发送数据时,任何子节点(此节点或其他节点)都可以接收到响应。这会导致错误浮动。我建议添加日志记录以确保连接在fork后被初始化。由于在Django中广泛使用全局变量,所以早期连接建立可以隐藏起来。请注意,在fork之前导入的整个代码。 – 2009-10-15 19:32:53

+0

我已经登录确定这一点。该连接仅在请求时,在孩子中响应于启动请求信号进行。在发送该请求以触发连接之前,子进程已经建立。 – ironfroggy 2009-10-15 20:43:52

2

即使这是非常古老的问题, 我发现最佳解决方案是在this答案。 只是做到以下几点:

from django import db 

和调用fork或使用多执行前:

db.connections.close_all() 
相关问题