2013-12-20 163 views
1

我目前正在編寫一個多線程應用程序,它將需要訪問數據庫以便爲請求提供服務。我看到很多人說,使用許多持久數據庫連接池是這種類型的應用程序的方式,但我試圖圍繞爲什麼這是這種情況。爲什麼數據庫連接池比單個連接好?

請記住,我在Erlang中設計這個應用程序,所以我會很多地使用線程/進程/工作。

所以,讓我們比較兩種情況:

  1. 你必須擁有一個數據庫連接一個單獨的線程。所有客戶端處理線程都會與此線程通信以進行數據庫查詢。

  2. 您有一個線程池,每個線程都有自己的數據庫連接。當客戶端處理線程想要訪問數據庫時,它從池中獲取這些線程中的一個,並使用它來查詢數據庫。

在第一種情況下,我看到很多人說它是壞的,因爲有一個線程處理所有與數據庫相關的查詢會導致瓶頸。但是我的困惑是:這個單線程的瓶頸不是數據庫本身嗎?如果線程正在做的是通過其連接句柄查詢數據庫,是不是等待數據庫響應主要等待時間的請求?如何在這個問題上拋出更多的連接線程來解決它?

回答

7

該數據庫可能具有良好的多線程能力。使用連接池允許:

  1. 利用數據庫的多線程/負載平衡能力
  2. 避免遍地

建立和拆除連接的開銷當數據庫服務多個連接,它可以自行決定如何優先處理請求。想象一下這樣的場景:

  1. 用戶A請求了一組從表A記錄的10萬行
  2. 用戶B請求一組從表B記錄有50行
  3. 用戶C更新表A

如果使用多個連接,數據庫可以利用事實:(1)和(2)可以同時發生,並且用戶B獲得他的50條記錄,而不必等待用戶A獲得他的全部100,000個。只有用戶C必須等待用戶A完成。

此外,建立和拆除TCP連接是一項相對昂貴的任務。使用池允許一個用戶在不拆除TCP連接的情況下釋放資源,因此下一個用戶不必等待新的連接。不過,您的單線程方法不會從連接池的這方面受益。

+0

嗯是的,很好的答案,我沒有真正考慮在這種情況下數據庫的內部。 – Doug