天天看點

【jdbc】資料庫連接配接池(資料源)【彙總】1. 參考資料2. 為什麼要連接配接池

文章目錄

  • 1. 參考資料
    • 1.1 概述
    • 1.2 HikariCP
    • 1.3 Druid
    • 1.4 tomcat連接配接池
  • 2. 為什麼要連接配接池
    • 2.1 需要注意的問題

1. 參考資料

1.1 概述

《高性能資料庫連接配接池的内幕》介紹了為什麼要使用連接配接池

《大話資料庫連接配接池》 連接配接池的發展曆史

《資料庫連性池性能測試(hikariCP,druid,tomcat-jdbc,dbcp,c3p0)》 壓力測試,不同連接配接池的性能對比

《資料庫連接配接池優化配置(druid,dbcp,c3p0)》 介紹如何優化配置連接配接池,并給出3種連接配接池的參數介紹

1.2 HikariCP

在Spring Boot 2.0版本中,預設資料庫池技術已從Tomcat Pool切換到HikariCP

《springBoot2.x中使用Hikari連接配接池詳解》 簡單介紹了如何配置HikariCP

1.3 Druid

《常見問題》Druid相關的問題彙總,介紹了相關的一些知識

《Druid連接配接池學習筆記》 比較詳細的介紹用法

《SSM整合Druid資料庫連接配接池》 類似一個helloworld那樣的入門例子 ,通過xml配置實作的

《阿裡Druid資料源 連接配接池》也是一個入門例子,是用JavaConfig寫的

1.4 tomcat連接配接池

《Java連接配接池詳解 tomcat》

《Tomcat 自帶的 JDBC 連接配接池官方文檔中文版》

2. 為什麼要連接配接池

《【mysql】 入門例子》中展示了一個未用連接配接池的例子,使用手動建立的一個連接配接。

下面是Mysql資料庫建立連接配接的的一段代碼:

我們建立了一個Connection對象,它在内部都執行了什麼:

  • 1.“DriverManager”檢查并注冊驅動程式;
  • 2.“com.mysql.jdbc.Driver”就是我們注冊了的驅動程式,它會在驅動程式類中調用“connect(url…)”方法。
  • 3.com.mysql.jdbc.Driver的connect方法根據我們請求的“connUrl”,建立一個“Socket連接配接”,連接配接到IP為“your.database.domain”,預設端口3306的資料庫。
  • 4.建立的Socket連接配接将被用來查詢我們指定的資料庫,并最終讓程式傳回得到一個結果。

簡單的擷取一個連接配接,系統卻要在背後做很多消耗資源的事情,大多時候,建立連接配接的時間比執行sql語句的時間還要長。

【jdbc】資料庫連接配接池(資料源)【彙總】1. 參考資料2. 為什麼要連接配接池

使用者每次請求都需要向資料庫獲得連結,而資料庫建立連接配接通常需要消耗相對較大的資源,建立時間也較長。假設網站一天10萬通路量,資料庫伺服器就需要建立10萬次連接配接,極大的浪費資料庫的資源,并且極易造成資料庫伺服器記憶體溢出、拓機。

采用連接配接池技術後的過程如下:

【jdbc】資料庫連接配接池(資料源)【彙總】1. 參考資料2. 為什麼要連接配接池

資料庫連接配接是一種關鍵的有限的昂貴的資源,這一點在多使用者的網頁應用程式中展現的尤為突出。對資料庫連接配接的管理能顯著影響到整個應用程式的伸縮性和健壯性,影響到程式的性能名額。資料庫連接配接池負責配置設定,管理和釋放資料庫連接配接,它允許應用程式重複使用一個現有的資料庫連接配接,而不是重建立立一個。

2.1 需要注意的問題

1、并發問題

為了使連接配接管理服務具有最大的通用性,必須考慮多線程環境,即并發問題。這個問題相對比較好解決,因為各個語言自身提供了對并發管理的支援像java,c#等等,使用synchronized(java)、lock(C#)關鍵字即可確定線程是同步的。

2、事務處理

我們知道,事務具有原子性,此時要求對資料庫的操作符合“ALL-OR-NOTHING”原則,即對于一組SQL語句要麼全做,要麼全不做。

我們知道當2個線程公用一個連接配接Connection對象,而且各自都有自己的事務要處理時候,對于連接配接池是一個很頭疼的問題,因為即使Connection類提供了相應的事務支援,可是我們仍然不能确定那個資料庫操作是對應那個事務的,這是由于我們有2個線程都在進行事務操作而引起的。為此我們可以使用每一個事務獨占一個連接配接來實作,雖然這種方法有點浪費連接配接池資源但是可以大大降低事務管理的複雜性。

3、連接配接池的配置設定與釋放

連接配接池的配置設定與釋放,對系統的性能有很大的影響。合理的配置設定與釋放,可以提高連接配接的複用度,進而降低建立新連接配接的開銷,同時還可以加快使用者的通路速度。

對于連接配接的管理可使用一個List。即把已經建立的連接配接都放入List中去統一管理。每當使用者請求一個連接配接時,系統檢查這個List中有沒有可以配置設定的連接配接。如果有就把那個最合适的連接配接配置設定給他(如何能找到最合适的連接配接文章将在關鍵議題中指出);如果沒有就抛出一個異常給使用者,List中連接配接是否可以被配置設定由一個線程來專門管理。

4、連接配接池的配置與維護

連接配接池中到底應該放置多少連接配接,才能使系統的性能最佳?系統可采取設定最小連接配接數(minConnection)和最大連接配接數(maxConnection)等參數來控制連接配接池中的連接配接。比方說,最小連接配接數是系統啟動時連接配接池所建立的連接配接數。如果建立過多,則系統啟動就慢,但建立後系統的響應速度會很快;如果建立過少,則系統啟動的很快,響應起來卻慢。這樣,可以在開發時,設定較小的最小連接配接數,開發起來會快,而在系統實際使用時設定較大的,因為這樣對通路客戶來說速度會快些。最大連接配接數是連接配接池中允許連接配接的最大數目,具體設定多少,要看系統的通路量,可通過軟體需求上得到。

如何確定連接配接池中的最小連接配接數呢?有動态和靜态兩種政策。動态即每隔一定時間就對連接配接池進行檢測,如果發現連接配接數量小于最小連接配接數,則補充相應數量的新連接配接,以保證連接配接池的正常運轉。靜态是發現空閑連接配接不夠時再去檢查。