2017-05-20 49 views
4

here爲什麼每次打開新連接時,系統的許多打開連接的連接池的成本較低?

通常的回答,開放數據庫連接是昂貴的操作,所以 池保持連接活躍,使得當一個連接是 以後請求,活性者之一被優先使用到 開放另一個。

我理解DB管理中的Connection Pool的概念。這是「什麼是〜」問題的答案。所有開發人員的博客文章,答案,教程,DB文檔總是回答一個問題「什麼是」。就像他們不斷複製/粘貼文本一樣。沒有人試圖解釋「爲什麼如此」和「如何」。上面的答案就是一個例子。

我不明白爲什麼如何可能保持一致,也就是說,30間打開的連接池中的是比在需要時打開一個新的連接的系統成本更低。

假設我有一個位於澳大利亞的網絡服務器。 AWS中的數據庫位於美國俄勒岡州的某個地方。或在GB。或者距離AUS很遠的地方。所以他們都說,保持一個20 -...打開的連接池對於內存和系統性能而言會比在這種情況下每次打開一個新連接成本更低?它是如何的?爲什麼?

+2

建立一個連接需要兩個端點之間的通信(思考握手),內存分配等。另外,如果你正在執行一個循環以執行一些數據庫交互,那麼重新使用相同的活動連接要比在循環內打開和關閉;即使進行單一連接只有很小的差異,它也會循環增長。 –

+2

綠色,因爲它的價值,我已經添加了額外的信息到提示這個問題的答案:請參閱http://stackoverflow.com/questions/4041114/what-is-database-pooling/4041136#4041136。但米奇和瑪麗亞基本上是對的,建立聯繫並不是一個即時的過程。 – paxdiablo

回答

3

在你的情況下,我認爲最大的問題是網絡延遲。你不能指望位於兩個不同大洲的服務器之間的通信速度特別快。因此,如果您每次需要時都啓動新連接,則每次都會遇到此延遲。

here

連接到數據庫服務器通常由幾個耗時的步驟。 必須建立物理通道,如套接字或命名管道,必須與服務器進行初始握手,必須解析連接字符串信息,必須由服務器驗證連接,必須運行檢查才能參與當前交易等等。

而且,如果Web服務器和數據庫之間的連接使用SSL/TLS,還有必須在所有新的連接實際通信之前進行可出現(除了正常的握手是ocurrs握手在正常連接中)。這種握手在時間上是昂貴的。

here

客戶端和服務器可以開始交換過TLS的應用程序數據之前,加密隧道必須協商:在客戶端和服務器必須在TLS協議的版本一致,選擇密碼套件,並在必要時驗證證書。不幸的是,這些步驟中的每一個都需要在客戶端和服務器之間進行新的數據包往返傳輸,從而將啓動延遲添加到所有TLS連接。 (...)作爲上述交流說明,新的TLS連接需要兩個往返一個「完整的握手」 - 這就是壞消息

當您使用連接池,這方面的開銷是通過定時發送像一個「平避免'消息到SQL服務器,以避免由於不活動導致連接超時。當然,這可能會消耗更多的內存在你的服務器,但現在這是一個更便宜的資源。網絡中的延遲是不可避免的。