2012-07-16 33 views
5

我有一個db = pymongo.Connection()在Django的views.py中調用一個簡單的MongoDB連接來存儲一些簡單的統計信息。Django + PyMongo池的最佳做法?

使自動支持MongoDB連接池的最佳做法是什麼?

我需要把end_request()代碼放在哪裏?

如何在連接期間選擇max_pool_size參數?

回答

7

How does connection pooling work in PyMongo?

每個連接實例已內置連接池。默認情況下,每個線程在其第一次操作中獲取自己的套接字。那些 套接字被保持,直到end_request()被該線程調用。

調用end_request()允許將套接字返回到池 並由其他線程使用而不是創建新的套接字。 明智地使用這種方法對於有很多 線程或長時間運行的線程的應用程序非常重要,這些線程幾乎不會調用PyMongo 操作。

或者,使用auto_start_request = False創建的連接將在所有線程中安全地共享套接字(socket)( )。

我認爲這取決於您擁有的應用程序的類型以及請求持續連接的時間。調用end_request的想法有助於長時間運行的請求長時間保持套接字,並導致創建多個套接字。如果單個請求可以在不再需要連接時釋放連接,則該套接字可用於其他請求。

如果他們是快速請求,那麼我相信auto_start_request=False通過重用套接字的作品。

確保連接始終使用相同的套接字表示將具有一致的讀取。想想如果你提出了一個查詢,但它延遲了,然後立即做了另一個查詢,並使用了一個不同的套接字。這個套接字設法在之前做出響應。你將會有不一致的數據,因爲它不能反映前面的寫入。

+0

嗨@jdi,感謝您的回答,您可以與'max_pool_size'參數分享您的提示嗎? – est 2012-07-16 06:35:16

+1

它是一種管理單個連接允許的連接數的方法。如果你的應用程序是單線程的,那麼它只會在池中消耗1個。如果它是一個嚴重線程的應用程序,則每個線程將有一個,並且您可能希望能夠限制在一臺服務器上允許的數量。 – jdi 2012-07-16 15:23:48

+1

在PyMongo 3中,「auto_start_request」選項消失。 – Mithril 2016-03-23 06:16:10