Mögliche Lösung: http://groups.google.com/group/django-users/browse_thread/thread/2c7421cdb9b99e48
Bis vor kurzem war ich neugierig 1.1.1 diese auf Django zu testen. Wird diese Ausnahme wieder geworfen ... Überraschung, da war es wieder. Es dauerte einige Zeit, um dies zu debuggen, hilfreicher Hinweis war , dass es nur zeigt, wenn (pre) Gabelung. erste für diejenigen also, die diese Ausnahmen zufällig bekommen, kann ich sagen ... fix Code :) Ok .. ernst, da sind dies immer einige Möglichkeiten zu tun, so lassen Sie mich erklären, wo Tannen ist ein Problem . Wenn Sie auf die Datenbank zugreifen, wenn eines Ihrer Module als z. Lesen der Konfiguration von Datenbank dann erhalten Sie diesen Fehler. Wenn Ihr fastcgi-prefork Anwendung beginnt, zuerst importiert sie alle Module, und erst nach dieser Gabeln Kinder. Wenn Sie DB-Verbindung beim Import eingerichtet haben alle Kinder verarbeitet eine exakte Kopie dieses Objekt haben wird. Diese Verbindung wird am Ende der Anforderungsphase geschlossen (request_finished signal). So zuerst Kind, das aufgerufen wird, Ihre Anfrage zu verarbeiten, wird diese Verbindung schließen. Aber was passiert mit der Rest der Kind-Prozesse? Sie wird glauben, dass sie offen und vermutlich Arbeits Verbindung zum db, so dass jeder db Betrieb verursacht eine Ausnahme. Warum wird dies nicht in Thread-Ausführungsmodell angezeigt? Ich nehme an, weil Threads das gleiche Objekt verwenden und wissen, wenn ein anderer Thread schließende Verbindung ist. Wie behebe ich das? Der beste Weg ist, Ihren Code zu reparieren ... aber das kann manchmal schwierig sein. Andere Option, meiner Meinung nach recht sauber, ist irgendwo in Ihrem Anwendung kleines Stück Code zu schreiben:
from django.db import connection
from django.core import signals
def close_connection(**kwargs):
connection.close()
signals.request_started.connect(close_connection)
Nicht ideal Gedanke, zweimal an die DB verbindet eine Abhilfe besten ist.
Mögliche Lösung: mit Verbindungspooling (pgpool, pgbouncer), so dass Sie haben DB-Verbindungen vereinigt und stabil und gab schnell auf Ihre FCGI Daemons.
Das Problem ist, dass dies ein weiterer Fehler auslöst, psycopg2 Auslösen eines InterfaceError, weil es versucht, zweimal zu trennen (pgbouncer dies bereits behandelt).
Jetzt ist der Schuldige Signal Django Auslösung connection.close request_finished(), und andernfalls, wenn es laut sogar bereits getrennt wurde. Ich glaube nicht, dass dieses Verhalten erwünscht ist, als ob die Anfrage bereits beendet wäre, uns ist die DB-Verbindung nicht mehr wichtig. Ein Patch zur Korrektur sollte einfach sein.
Die entsprechenden Zurückverfolgungs:
/usr/local/lib/python2.6/dist-packages/Django-1.1.1-py2.6.egg/django/core/handlers/wsgi.py in __call__(self=<django.core.handlers.wsgi.WSGIHandler object at 0x24fb210>, environ={'AUTH_TYPE': 'Basic', 'DOCUMENT_ROOT': '/storage/test', 'GATEWAY_INTERFACE': 'CGI/1.1', 'HTTPS': 'off', 'HTTP_ACCEPT': 'application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate', 'HTTP_AUTHORIZATION': 'Basic dGVzdGU6c3VjZXNzbw==', 'HTTP_CONNECTION': 'keep-alive', 'HTTP_COOKIE': '__utma=175602209.1371964931.1269354495.126938948...none); sessionid=a1990f0d8d32c78a285489586c510e8c', 'HTTP_HOST': 'www.rede-colibri.com', ...}, start_response=<function start_response at 0x24f87d0>)
246 response = self.apply_response_fixes(request, response)
247 finally:
248 signals.request_finished.send(sender=self.__class__)
249
250 try:
global signals = <module 'django.core.signals' from '/usr/local/l.../Django-1.1.1-py2.6.egg/django/core/signals.pyc'>, signals.request_finished = <django.dispatch.dispatcher.Signal object at 0x1975710>, signals.request_finished.send = <bound method Signal.send of <django.dispatch.dispatcher.Signal object at 0x1975710>>, sender undefined, self = <django.core.handlers.wsgi.WSGIHandler object at 0x24fb210>, self.__class__ = <class 'django.core.handlers.wsgi.WSGIHandler'>
/usr/local/lib/python2.6/dist-packages/Django-1.1.1-py2.6.egg/django/dispatch/dispatcher.py in send(self=<django.dispatch.dispatcher.Signal object at 0x1975710>, sender=<class 'django.core.handlers.wsgi.WSGIHandler'>, **named={})
164
165 for receiver in self._live_receivers(_make_id(sender)):
166 response = receiver(signal=self, sender=sender, **named)
167 responses.append((receiver, response))
168 return responses
response undefined, receiver = <function close_connection at 0x197b050>, signal undefined, self = <django.dispatch.dispatcher.Signal object at 0x1975710>, sender = <class 'django.core.handlers.wsgi.WSGIHandler'>, named = {}
/usr/local/lib/python2.6/dist-packages/Django-1.1.1-py2.6.egg/django/db/__init__.py in close_connection(**kwargs={'sender': <class 'django.core.handlers.wsgi.WSGIHandler'>, 'signal': <django.dispatch.dispatcher.Signal object at 0x1975710>})
63 # when a Django request is finished.
64 def close_connection(**kwargs):
65 connection.close()
66 signals.request_finished.connect(close_connection)
67
global connection = <django.db.backends.postgresql_psycopg2.base.DatabaseWrapper object at 0x17b14c8>, connection.close = <bound method DatabaseWrapper.close of <django.d...ycopg2.base.DatabaseWrapper object at 0x17b14c8>>
/usr/local/lib/python2.6/dist-packages/Django-1.1.1-py2.6.egg/django/db/backends/__init__.py in close(self=<django.db.backends.postgresql_psycopg2.base.DatabaseWrapper object at 0x17b14c8>)
74 def close(self):
75 if self.connection is not None:
76 self.connection.close()
77 self.connection = None
78
self = <django.db.backends.postgresql_psycopg2.base.DatabaseWrapper object at 0x17b14c8>, self.connection = <connection object at 0x1f80870; dsn: 'dbname=co...st=127.0.0.1 port=6432 user=postgres', closed: 2>, self.connection.close = <built-in method close of psycopg2._psycopg.connection object at 0x1f80870>
Ausnahme hier Umgang mit mehr Nachsicht könnte hinzufügen:
/usr/local/lib/python2.6/dist-packages/Django-1.1.1-py2 .6.egg/django/db/__ init__.py
63 # when a Django request is finished.
64 def close_connection(**kwargs):
65 connection.close()
66 signals.request_finished.connect(close_connection)
Oder es könnte besser auf psycopg2 behandelt werden, so nicht fatale Fehler auslösen, wenn alles, was wir disconn zu tun versuchen ist ect und es ohnehin schon ist:
/usr/local/lib/python2.6/dist-packages/Django-1.1.1-py2.6.egg/django/db/backends/__init__.py
74 def close(self):
75 if self.connection is not None:
76 self.connection.close()
77 self.connection = None
Ansonsten bin ich kurz auf Ideen.
Das löst das Problem nicht selbst. Umgehe es einfach. : P könnte für manche Leute keine Option sein. – pkoch