2009-10-15 147 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()