2012-07-16 40 views
5

Tôi có một cuộc gọi db = pymongo.Connection() trong views.py của Django cho một kết nối MongoDB đơn giản để lưu trữ một số số liệu thống kê đơn giản.thực hành tốt nhất của django + PyMongo tổng hợp?

Thực tiễn tốt nhất để làm cho nó tự động hỗ trợ kết nối nối MongoDB là gì?

Tôi cần phải đặt mã số end_request() ở đâu?

Làm cách nào để chọn thông số max_pool_size trong khi kết nối?

Trả lời

7

How does connection pooling work in PyMongo?

Mỗi dụ kết nối đã được xây dựng-in kết nối tổng hợp. Theo mặc định, mỗi luồng có ổ cắm riêng được đặt trước trong lần vận hành đầu tiên. Những ổ cắm này được giữ cho đến khi end_request() được gọi bởi luồng đó.

Gọi end_request() cho phép socket được trả về hồ bơi, và được sử dụng bởi các chủ đề khác thay vì tạo ổ cắm mới. Sử dụng cẩn thận phương pháp này rất quan trọng đối với các ứng dụng có nhiều chủ đề là hoặc với các chuỗi chạy dài thực hiện một vài cuộc gọi đến các hoạt động PyMongo .

Cách khác, kết nối được tạo bằng auto_start_request = False sẽ chia sẻ ổ cắm (an toàn) trong tất cả các chuỗi.

Tôi nghĩ rằng ứng dụng này thuộc loại ứng dụng bạn có và thời gian yêu cầu sẽ giữ kết nối. Ý tưởng gọi end_request giúp với các yêu cầu chạy dài giữ trên ổ cắm trong một thời gian dài và khiến nhiều ổ cắm được tạo ra. Nếu một yêu cầu duy nhất có thể giải phóng kết nối khi nó không còn cần đến nữa, thì ổ cắm có thể được đặt lại cho các yêu cầu khác.

Nếu chúng là yêu cầu nhanh, thì tôi tin rằng auto_start_request=False hoạt động bằng cách sử dụng lại ổ cắm.

Đảm bảo kết nối tiếp tục sử dụng cùng một ổ cắm có nghĩa là sẽ có lần đọc nhất quán. Hãy suy nghĩ nếu bạn đã thực hiện một truy vấn nhưng nó đã bị trì hoãn, và sau đó vô tình thực hiện một truy vấn khác và nó đã sử dụng một ổ cắm khác. Ổ cắm này quản lý để trả lời trước đó. Bạn sẽ có dữ liệu không nhất quán vì nó không phản ánh ghi trước đó.

+0

Xin chào @jdi, cảm ơn câu trả lời, bạn có thể chia sẻ mẹo của mình với thông số 'max_pool_size' không? – est

+1

Một cách để bạn quản lý số lượng kết nối mà một kết nối sẽ cho phép. Nếu ứng dụng của bạn là đơn luồng thì nó sẽ chỉ bao giờ tiêu thụ 1 trong hồ bơi. Nếu nó là một ứng dụng có luồng rất lớn, sẽ có một luồng cho mỗi luồng và bạn có thể muốn có khả năng giới hạn số lượng nó sẽ cho phép trên một máy chủ – jdi

+1

Trong PyMongo 3, tùy chọn "auto_start_request" đã biến mất. – Mithril

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