2016-11-08 61 views
2

如果我不需要事務,我可以重複使用同一個數據庫連接來處理多個請求嗎?重複使用多個請求的數據庫連接

瓶文檔says

因爲數據庫連接封裝事務,我們還需要確保只有一個當時請求使用的連接。

這就是我所理解上述句子的意思:

Python的DB-API連接只能同時處理一個交易;要開始新的交易,必須先提交或回滾前一個交易。因此,如果我們的每個請求都需要自己的事務,那麼當然每個請求都需要它自己的數據庫連接。

請讓我知道,如果我聽錯了。

但我們假設我設置了自動提交模式,並在單個SQL語句中處理每個請求。或者,也可以說,我只是讀 - 不寫 - 到數據庫。在這兩種情況下,似乎我可以重新使用相同的數據庫連接爲我的所有請求,以節省多連接的開銷。但我不確定這種方法是否有任何不利之處。

編輯:我可以看到我提議的一個問題:每個請求可能由不同的進程處理。由於連接應該是probably not be reused across processes,請讓我澄清我的問題:我的意思是爲每個進程創建一個連接,並將其用於所有發生此進程處理的請求。

在另一方面,(綠色或本地)線程整點通常是服務於每個線程的一個要求,所以我的建議做法意味着共享跨線程連接。看起來好像是one connection can be used concurrently in multiple native threads,但是not in multiple green threads

所以我們可以說爲了具體我的環境是瓶+多的多線程同步工人gunicorn。

回答

1

基於@Craig林格comment on a different question,我想我知道答案。

的連接共享的唯一可能的優點是性能(其他因素 - 如事務封裝和簡單 - 偏愛每個請求一個單獨的連接)。由於無法在進程或綠色線程之間共享連接,因此只有原生線程有機會。但psycopg2(以及其他驅動程序)不允許來自同一連接的併發訪問。因此,除非每個請求花費很少的時間與數據庫交談,否則連接共享可能會導致性能下降,而不會帶來好處。

+0

還有的地方共享連接需要一個其他可能的情況下,那就是當你想不同的工人看到同樣的髒(未提交的)數據或共享會話狀態像臨時表,WITH HOLD遊標等,但它是一個有點一段時間。 –

+0

@CraigRinger但不同的工作人員是不同的過程(至少在gunicorn中),如果所有人都共享相同的連接(並且實際使用它),我認爲他們會相互碰撞(根據我的問題引用的警告)。還是你的意思是可以使用鎖來避免這個問題? – max

+0

如果他們不同*進程*他們不能共享連接。 (OK,所以如果你沒有執行exec分支或將套接字傳遞給子進程是可能的,但只會導致混亂,不會以任何有用的方式工作)。 –