giải pháp có thể: http://groups.google.com/group/django-users/browse_thread/thread/2c7421cdb9b99e48
Cho đến gần đây tôi đã tò mò muốn thử nghiệm này trên Django 1.1.1. Điều này sẽ vi phạm một lần nữa ... bất ngờ, lại ở đó. Nó đã cho tôi một số thời gian để gỡ lỗi này, gợi ý hữu ích là rằng nó chỉ hiển thị khi (trước) forking. Vì vậy, đối với những người nhận ngẫu nhiên những ngoại lệ đó, tôi có thể nói ... sửa mã của bạn :) Ok .. nghiêm túc, có luôn có vài cách để thực hiện việc này, vì vậy hãy để tôi giải thích vấn đề ở đâu trước tiên là . Nếu bạn truy cập cơ sở dữ liệu khi bất kỳ mô-đun nào của bạn sẽ nhập như, ví dụ: đọc cấu hình từ cơ sở dữ liệu sau đó bạn sẽ nhận được lỗi này. Khi ứng dụng quickcgi-prefork của bạn bắt đầu, trước tiên nó sẽ nhập tất cả các mô-đun, và chỉ sau khi dĩa này trẻ em. Nếu bạn đã thiết lập kết nối db trong quá trình nhập tất cả các quy trình trẻ em sẽ có bản sao chính xác của đối tượng đó. Kết nối này đang được đóng vào cuối yêu cầu pha (tín hiệu yêu cầu_finished). Vì vậy, đầu tiên trẻ em sẽ được gọi để xử lý yêu cầu của bạn, sẽ đóng kết nối này. Nhưng điều gì sẽ xảy ra với phần còn lại của quá trình con? Họ sẽ tin rằng họ đã mở và có lẽ là kết nối làm việc với số db, do đó, bất kỳ hoạt động nào của db cũng sẽ gây ra một ngoại lệ . Tại sao điều này không hiển thị trong mô hình thực thi luồng? Tôi giả sử vì chủ đề đang sử dụng cùng một đối tượng và biết khi nào bất kỳ chủ đề nào khác là đóng kết nối. Làm thế nào để sửa lỗi này? Cách tốt nhất là sửa mã của bạn ... nhưng điều này đôi khi có thể khó khăn. tùy chọn khác, theo ý kiến của tôi khá sạch, là viết ở đâu đó trong ứng dụng của bạn đoạn mã nhỏ:
from django.db import connection
from django.core import signals
def close_connection(**kwargs):
connection.close()
signals.request_started.connect(close_connection)
Không suy nghĩ lý tưởng, kết nối hai lần để DB là một cách giải quyết tốt nhất.
Giải pháp có thể: sử dụng kết nối DB gộp lại và ổn định, đồng thời chuyển nhanh đến các trình nền FCGI của bạn.
Vấn đề là điều này kích hoạt một lỗi khác, psycopg2 nâng lên một giao diện Error vì nó đang cố gắng ngắt kết nối hai lần (pgbouncer đã xử lý việc này).
Bây giờ là thủ phạm là Django tín hiệu request_finished kích hoạt connection.close(), nhưng thất bại lớn ngay cả khi nó đã được ngắt kết nối. Tôi không nghĩ rằng hành vi này là mong muốn, như thể yêu cầu đã hoàn tất, chúng tôi không quan tâm đến kết nối DB nữa. Một bản vá để sửa lỗi này phải đơn giản.
Các traceback liên quan:
/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>
xử lý ở đây có thể bổ sung thêm khoan dung Ngoại lệ:
/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)
Hoặc nó có thể được xử lý tốt hơn trên psycopg2, vì vậy để không ném lỗi gây tử vong nếu tất cả chúng ta đang cố gắng làm là disconn ect và nó đã là:
/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
Ngoài ra, tôi thiếu ý tưởng.
Điều này không giải quyết được vấn đề. Chỉ cần bỏ qua nó. : P Có thể không phải là một lựa chọn cho một số người. – pkoch