數據庫連接池大小設置為多少更合適


數據庫連接是有限的、昂貴的資源,一個數據庫連接對象對應一個物理數據庫的連接,如果每次數據庫操作都創建新的連接,使用完后釋放,會導致系統性能低下,這就引出了連接池的概念。

連接池的必要性

數據庫連接池是負責分配、管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,可以視作一個存放數據庫連接的容器。

數據庫連接池采用了資源池設計模式,用於資源共享,避免資源的頻繁分配與釋放問題。同時便於統一管理,可以通過對連接池的控制,限制系統與數據庫的連接,監視數據庫的連接數量和使用情況

1、不使用連接池流程

下面以訪問MySQL為例,執行一個SQL命令,如果不使用連接池,需要經過哪些流程。

  1. TCP建立連接的三次握手
  2. MySQL認證的三次握手
  3. 真正的SQL執行
  4. MySQL的關閉
  5. TCP的四次揮手關閉

為了執行一條SQL,卻多了非常多網絡交互。
優點:實現簡單
缺點:

  • 網絡IO較多
  • 數據庫的負載較高
  • 響應時間較長及QPS較低
  • 應用頻繁的創建連接和關閉連接,導致臨時對象較多,GC頻繁
  • 在關閉連接后,會出現大量TIME_WAIT 的TCP狀態(在2個MSL之后關閉)

2、使用連接池流程

使用數據庫連接池的步驟:

第一次訪問的時候,需要建立連接。 但是之后的訪問,均會復用之前創建的連接,直接執行SQL語句。
優點:

  • 較少了網絡開銷
  • 系統的性能會有一個實質的提升
  • 沒了麻煩的TIME_WAIT狀態

數據庫連接數設置

系統可采取設置最小連接數和最大連接數等參數來控制連接池中的連接。最小連接數是系統啟動時創建的數據庫連接數。最小連接數小,則啟動快,響應慢。通常設置較大一些。最小連接數可以設置為5個-10個。最大連接數根據硬件配置設置,4核心機器可以設為10個,8核心可以設為20個。

HikariCP的默認的最大和最小連接數是10。作者建議是設置最大和最小連接數為相同的值,維護一個高性能連接池。

為什么連接池數並不是越大越好?

第一點,首先我們要知道單核CPU“同時”運行多個線程,只不過是假象。單核CPU同一時刻只能執行一個線程,然后操作系統切換上下文,CPU 核心快速調度,執行另一個線程的代碼。這其中便涉及到了大量上下文切換帶來的額外性能損耗。

第二點,由上可知,一個N核心服務器,設置數據庫連接數為N便能提供最優性能。然而,實際情況會受到磁盤IO和網絡IO的影響,在IO等待時間內,線程阻塞等待,CPU處於空閑狀態。因此,在線程處理I/O密集業務操作時,需要設置線程/連接數比CPU大一些,以提高吞吐量。

連接數的計算公式

連接數 = ((核心數 * 2) + 有效磁盤數)

服務器 CPU 是 4核 i7 的,連接池大小應該為 ((4 * 2) + 1) = 9 ~ 10個。具體需要根據實際業務場景做調整。

業務場景

  • 對於並發訪問,可以采用小的數據庫連接池,然后將剩下的業務線程放在隊列中等待。
  • 如果系統中混合了長事務和短事務,正確的做法應該是創建兩個連接池,一個服務於長事務,一個服務於"實時"查詢,也就是短事務。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM