简体   繁体   English

psycopg2与服务器断开连接

[英]psycopg2 disconnects from server

I've been tackling this for a while. 我一直在解决这个问题。 I setup a completely new machine. 我设置了一台全新的机器。 I've installed a fresh copy of postgresql and all my other dependencies. 我已经安装了postgresql和我所有其他依赖项的新副本。 Basically, I get these database disconnections at random times. 基本上,我随机地将这些数据库断开连接。 I can perform identical requests and either it works or it doesn't. 我可以执行相同的请求,无论是有效还是无效。 Very nondeterministic in outward appearance. 外观非常不确定。 Watching logs at Postgresql, it doesn't even get a connection. 在Postgresql上查看日志,它甚至没有连接。 Now, I would expect that if it never connected I would get this problem when establishing the connection and getting the cursor, but I get it when trying to actually use the connection later. 现在,我希望如果它从未连接,我会在建立连接和获取光标时遇到此问题,但是我在以后尝试实际使用连接时会得到它。 Given the traceback below, I would expect to see a connection made in the pg logs, and then disconnected for some reason later. 鉴于下面的回溯,我希望看到在pg日志中建立连接,然后由于某种原因断开连接。 I don't, so I wonder if there is some clue in that mismatch. 我没有,所以我想知道是否有一些不匹配的线索。

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.

This is a very similar question to the one posted here: 这是一个与此处发布的问题非常类似的问题:

Django + FastCGI - randomly raising OperationalError Django + FastCGI - 随机提升OperationalError

I imagine the answer will be the same to both if and when someone eventually figured it out. 我想,如果有人最终弄明白,那么答案将是相同的。 This same problem has been bothering me for about a month now and I have no idea what could be causing it. 同样的问题一直困扰着我一个月左右,我不知道是什么原因造成的。

Do you fork() child processes (use preforked FastCGI or something similar)? 你是fork()子进程(使用preforked FastCGI或类似的东西)? This might be the reason that connection established in parent process doesn't work in child. 这可能是父进程中建立的连接在子进程中不起作用的原因。 If you use preforked method it's easy to switch to threading to see whether the problem has gone away. 如果你使用preforked方法,很容易切换到线程,看看问题是否已经消失。 I saw exactly the same floating error in such case. 在这种情况下,我看到完全相同的浮动错误。

Even though it's very old question, Best Solution I've found is in this answer. 即使这是一个非常古老的问题,我发现最佳解决方案就是这个答案。 just do the following: 只需执行以下操作:

from django import db

and before calling fork or using multiprocessing execute: 在调用fork或使用多处理执行之前:

db.connections.close_all()

In my case, my WSGI server, uWSGI, was forking my app processes such that the underlying connection pool was shared. 就我而言,我的WSGI服务器uWSGI正在分支我的应用程序进程,以便共享底层连接池。 This was causing undefined behavior that (non-deterministically) was sending connections down as OP saw. 这导致了未定义的行为(非确定性地)正在OP看到发送连接。

I'd recommend ensuring your app processes are eagerly forked. 我建议确保您的应用程序流程急切分叉。 In uWSGI you do that with the option 在uWSGI中,您可以使用该选项

lazy-apps = true

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM