2011-11-20 25 views
10

Tôi đang chạy Django 1.3 với PostgreSQL 9.1/PostGIS 1.5, psycopg2 2.4.2 và pgbouncer 1.4.2.pgbouncer - đóng vì: máy chủ không sạch trên mọi kết nối

Trên mỗi kết nối duy nhất để cơ sở dữ liệu tôi nhận được một bản ghi trong pgbouncer.log:

2011-11-20 02: 15: 25,027 29.538 LOG S-0x96c2200: app_db/[email protected] : 5432 đóng vì: máy chủ không sạch (tuổi = 0).

Tôi không thể tìm thấy giải pháp nào cho vấn đề này - bất kỳ ai cũng có ý tưởng tại sao? Tôi đã cố gắng cấu hình lại pgbouncer (chế độ phiên/giao dịch, thời gian chờ khác nhau, vv), nhưng không có kết quả.

Trả lời

15

Ok, tôi nghĩ rằng tôi đã tìm ra điều này. Vấn đề nằm ở vấn đề lâu dài với Django và Psycopg2. Về cơ bản, Psycopg2 sẽ tự động đưa ra một phát biểu BEGIN cho DB. Tuy nhiên, nếu Django nghĩ rằng không có sửa đổi dữ liệu nào xảy ra, nó sẽ không phát hành COMMIT khi kết thúc giao dịch.

Có một vài giải pháp cho vấn đề này, hãy xem http://www.slideshare.net/OReillyOSCON/unbreaking-your-django-application để biết thêm chi tiết. Lý tưởng nhất là bạn tắt các cam kết tự động (bằng cách đặt autocommit = True trong các thiết lập DB của bạn, quy ước đặt tên khó xử). Điều này ngăn cản các giao dịch trên các hàm chỉ đọc, mà còn trên các hàm viết nên bạn cần phải tự bọc các hàm đó trong một trình trang trí @commit_on_success.

Hoặc, chỉ cần thêm django.middleware.transaction.TransactionMiddleware vào các lớp Middleware của bạn. Điều này sẽ bao trùm mọi yêu cầu trong một giao dịch. Điều này cũng có nghĩa là không cần thiết phải gói các yêu cầu chỉ đọc trong một giao dịch, nhưng đó là một giải pháp nhanh chóng và bẩn.

+0

Ok chỉ phát hiện ra một cách khó khăn, CẢNH BÁO: không chỉ làm điều này nếu bạn sử dụng cần tây (hoặc cái gì khác) để xử lý tác vụ nền. Có thể sẽ có các điều kiện chủng tộc trong đó bạn chuyển khóa chính của một đối tượng đến một tác vụ đang chạy không đồng bộ. Nhiệm vụ có thể bắt đầu chạy trước khi yêu cầu được hoàn thành (và giao dịch đã cam kết), do đó nhiệm vụ không thể tìm thấy đối tượng. Tôi nghĩ giải pháp duy nhất cho việc này là quản lý giao dịch thủ công. – Dick

+1

Chỉ cần một lưu ý để nói cảm ơn vì liên kết đến bài trình bày của tôi ... Tôi rất vui vì nó hữu ích! :) – Christophe

+0

Tất nhiên! Đó là một bài thuyết trình tuyệt vời; Tôi tìm thấy nó tuyệt vời mà rất ít được biết về quản lý giao dịch 'bị hỏng' ở Django. – Dick

Các vấn đề liên quan