psycopg2 与服务器断开连接
Posted
技术标签:
【中文标题】psycopg2 与服务器断开连接【英文标题】:psycopg2 disconnects from server 【发布时间】:2010-12-07 02:41:01 【问题描述】:我处理这个问题已经有一段时间了。我设置了一台全新的机器。我已经安装了 postgresql 和我所有其他依赖项的新副本。基本上,我会随机断开这些数据库。我可以执行相同的请求,它要么工作要么不工作。外观非常不确定。在 Postgresql 上查看日志,它甚至没有连接。现在,我希望如果它从未连接过,我会在建立连接和获取光标时遇到这个问题,但是当我稍后尝试实际使用连接时会遇到这个问题。鉴于下面的回溯,我希望在 pg 日志中看到一个连接,然后由于某种原因断开连接。我不知道,所以我想知道这种不匹配是否有一些线索。
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.
【问题讨论】:
我认为您的问题的部分解决方案可以在这里找到:***.com/a/33128806/2144966 【参考方案1】:这是一个与此处发布的问题非常相似的问题:
Django + FastCGI - randomly raising OperationalError
我想如果有人最终想通了,答案将是相同的。同样的问题已经困扰我大约一个月了,我不知道是什么原因造成的。
【讨论】:
今天早些时候终于被指出了,并计划自己从这里链接到它。这是一个真正的问题,显然我们很多人都遇到过,但要获取证据和查找信息可能非常困难。感谢您的提示。【参考方案2】:您是否fork()
子进程(使用预分叉的 FastCGI 或类似的东西)?这可能是在父进程中建立的连接在子进程中不起作用的原因。如果您使用 preforked 方法,很容易切换到线程以查看问题是否已经消失。在这种情况下,我看到了完全相同的浮动错误。
【讨论】:
当我使用预分叉的 fastcgi 后端时,连接是在子进程中按请求建立的。此外,如果是这样的情况,我希望问题更容易预测,而实际上请求通常会成功,而失败在表面上是不确定的。 当子错误继承套接字描述符并向其发送数据时,任何子(此或其他)都可以接收响应。这会导致错误浮动。我建议添加日志记录以确保在分叉后初始化连接。由于在 django 中广泛使用全局变量,早期连接建立可以隐藏在您的视线之外。请注意,在 fork 之前导入的整个代码。 我已经登录以确定这一点。连接仅在请求时在子节点中建立,以响应 start-request 信号。在发送该请求以触发连接之前,子进程已经建立。【参考方案3】:尽管这是一个非常古老的问题, 我找到的最佳解决方案在this 答案中。 只需执行以下操作:
from django import db
在调用 fork 或使用多处理执行之前:
db.connections.close_all()
【讨论】:
【参考方案4】:就我而言,我的 WSGI 服务器 uWSGI 正在分叉我的应用程序进程,以便共享底层连接池。这导致了未定义的行为,即(非确定性地)在 OP 看到的情况下发送连接。
我建议确保您的应用程序进程是热切分叉的。在 uWSGI 中,您可以使用选项
lazy-apps = true
【讨论】:
以上是关于psycopg2 与服务器断开连接的主要内容,如果未能解决你的问题,请参考以下文章