13

我已经解决了一段时间。我设置了一台全新的机器。我已经安装了 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.
4

4 回答 4

5

这是一个与此处发布的问题非常相似的问题:

Django + FastCGI - 随机引发 OperationalError

我想如果有人最终弄清楚了,答案将是相同的。同样的问题已经困扰我大约一个月了,我不知道是什么原因造成的。

于 2009-10-16T18:58:24.890 回答
2

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

于 2009-10-15T16:53:15.530 回答
2

尽管这是一个非常古老的问题,但我发现的最佳解决方案就是在这个答案中。只需执行以下操作:

from django import db

在调用 fork 或使用多处理执行之前:

db.connections.close_all()
于 2017-01-03T17:10:37.093 回答
0

就我而言,我的 WSGI 服务器 uWSGI 正在分叉我的应用程序进程,以便共享底层连接池。这导致了未定义的行为,即(非确定性地)像 OP 看到的那样发送连接。

我建议确保您的应用程序进程急切地分叉。在 uWSGI 中,您可以使用选项执行此操作

lazy-apps = true

于 2019-03-08T21:13:41.987 回答