2014-02-28 35 views
0

我一直在閱讀關於connection pooling的SQLAlchemy文檔,而主題本身很簡單;我認爲它與你如何部署應用程序有很大關係(我在這裏討論WSGI應用程序)。最近我開始使用Gunicorn。它有幾種類型的工人。目前,我只使用同步工作者:那些「一次處理單個請求」的人。在不同的部署環境中使用SQLAlchemy連接池

因此,在這種情況下,最好使用StaticPool,即每個工作人員單個可重用的連接?或者,即使在同步工作者的情況下,SQLAlchemy也可以嘗試進行多個連接? - 假定應用程序本身不使用線程。

回答

3

有充分的理由只是堅持的QueuePool默認:因爲它要求在時刻

  1. QueuePool只打開儘可能多的連接。如果您的應用一次只使用一個連接,那麼這是您的應用打開的唯一連接。 (所有需要數據庫訪問的東西基本上都會使用單個連接來訪問數據庫,比如create_all()或者Session.query()。不管怎樣,SQLAlchemy本身並不會打開額外的連接。它一次只使用一個連接。)。

  2. 如果您的應用確實碰巧有某種事情會一次引發多個連接,例如,一次使用兩個Session對象,或者在您仍在提取的時候調用engine.execute()來自另一個engine.execute()的結果,QueuePool將設置第二個連接而不會有任何問題。而StaticPool將使用相同的連接,然後你會遇到問題。

  3. 如果你真的想確保你的應用程序每個進程只使用一個連接,你可以看看AssertionPool--這更像是一個調試/測試池,但不一定是我們用過的規模。或者設置QueuePool與pool_size = 1個max_overflow = 0,這將基本上導致死鎖如果您嘗試在一個線程中同時打開兩個連接....

+0

我要玩隨着AssertionPool在開發中,所以我可以獲得更多的見解。但我認爲我有重點。 – manu