2012-02-15 27 views
7

Tôi đã thực hiện một cuộc trò chuyện, sử dụng tính năng bỏ phiếu dài và Gevent. Để đọc, ứng dụng sẽ cập nhật chế độ xem cập nhật và đợi với Gevent.event.wait để cập nhật.Django, cuộc thăm dò ý kiến ​​dài của Ajax, Postgresql: giao dịch nhàn rỗi

Sự cố: Giao dịch Postgresql được mở bởi Django khi bắt đầu yêu cầu (để nhận thông tin phiên) không được đóng cho đến khi kết thúc yêu cầu. Và những giao dịch nhàn rỗi này mất rất nhiều bộ nhớ.

Cách nào là cách sạch nhất để đóng giao dịch Postgresql mà không đóng yêu cầu? Tôi hiện đang gửi tín hiệu yêu cầu request_finished theo cách thủ công nhưng nó giống như một bản hack.

Trả lời

2

Cách bạn đang thực hiện nó có lẽ là cách tốt nhất trong khuôn khổ hack của bạn. Có lý do gì khiến bạn đang cố gắng bỏ phiếu dài trong quá trình yêu cầu phản hồi thay vì sử dụng một cái gì đó như django-socketio?

+0

Chúng tôi mất một thời gian dài cố gắng để làm cho socketio làm việc thông qua nginx (front end) với gevent/gunicorn/apache (back end). Nginx không thể làm điều đó mà không có số lượng mod cao. Và ngay cả với những người đó, chúng tôi không thể liên kết id người dùng socketio với id phiên django, vì vậy chúng tôi không thể lấy thông tin người dùng. Nếu bạn có một hướng dẫn đầy đủ để giới thiệu, chúng tôi rất thích nhìn thấy nó. Hầu hết các hướng dẫn sử dụng socketio - chat mà chúng tôi tìm thấy, không sử dụng thông tin người dùng django hoặc giao diện người dùng. – Ashe

+1

Theo như làm cho phụ trợ SocketIO và django auth làm việc cùng nhau: https://gist.github.com/fd8e9631368e447de702 –

+0

Thành thật mà nói, chúng tôi sẽ không quay trở lại ngay bây giờ, nhưng chúng tôi chắc chắn sẽ giữ điều đó cho sau này. Cảm ơn bạn. – Ashe

0

Xem ở đây: https://docs.djangoproject.com/en/dev/topics/db/transactions/#django.db.transaction.commit_manually

@transaction.commit_manually 
def yourview(request): 
    # do your db actions 
    transaction.commit() 

Hoặc nếu bạn thích các nhà quản lý bối cảnh:

def yourview(request): 
    ... 
    with transaction.commit_manually(): 
     # do your db actions 
    ... 

Ngoài ra nếu bạn đang gặp vấn đề bộ nhớ giữ kết nối PostgreSQL mở bạn nên tìm kiếm một giải pháp tổng hợp sử dụng pgbouncer hoặc các nhóm kết nối khác nhau tồn tại. Bạn sẽ thấy một số lợi ích hiệu suất khá lớn từ việc này.

+0

Chúng tôi đã thử với rollback, chúng tôi sẽ thực hiện một thử nghiệm với cam kết và xác nhận câu trả lời nếu nó hoạt động. Và có một cái nhìn cho các kỹ thuật bạn đề nghị. Cảm ơn câu trả lời! – Ashe

+0

Nó không hoạt động cho chúng tôi. Tôi đoán giao dịch được mở bên trong commit_manually và một mở trước đó bởi django không giống nhau (hoặc có cái gì đó chúng ta không hiểu). Chúng tôi vẫn có kết nối nhàn rỗi khi chúng tôi sử dụng kỹ thuật này thay vì hack của chúng tôi (xấu xí). – Ashe

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