理解數據庫連接池底層原理之手寫實現

前言

數據庫連接池的基本思想是:為數據庫連接建立一個“緩沖池”,預先在池中放入一定數量的數據庫連接管道,需要時,從池子中取出管道進行使用,操作完畢后,在將管道放入池子中,從而避免了頻繁的向數據庫申請資源,釋放資源帶來的性能損耗。在如今的分布式系統當中,系統的QPS瓶頸往往就在數據庫,所以理解數據庫連接池底層構造原理與設計思想是很有益處的。我們常用的數據庫連接池有C3P0,DBCP,Druid等,下面我們就來分析下數據庫連接池應該有些什么,以及手寫一個迷你版的數據庫連接池!

對數據庫連接池的一點思考


數據庫連接池

第一,數據庫連接池中存放的就是數據庫操作管道,不僅僅是存放,而且應該是管理這些管道;

第二,應該提供外部配置文件去初始化數據庫連接池;

第三,如果一個數據庫操作管道已經被占用,那么其他請求是否應該得到這個管道,也就是說我們要考慮多線程并發下,管道的分配問題;

第四,如果做到管道的復用?放回池子中,標示可用,并不是真正的關閉管道;


寫一個迷你版數據庫連接池


工程類關系圖說明

IMyPool是一個接口,對外提供數據庫連接池的基本服務,比如得到一個數據庫操作管道。

MyDefaultPool是IMyPool的實現。

MyPooledConnection代表數據庫操作管道,它可以執行SQL,關閉管道等。

MyPoolFactory是一個工廠,單例模式,用于得到IMyPool實現。

DBConfigXML代表外部配置文件。

Test用于測試。

DBConfigXML

DBConfigXML

我們在實際中使用數據庫連接池,需要在Spring的配置文件中,進行一些參數配置。這里,為了簡化解析,直接提供。

MyPooledConnection

數據庫連接管道

所謂數據庫連接管道,就是對JDBC Connection進行封裝而已,但是需要注意isBusy的這個標示。對管道的關閉,實際上只是標示的改變而已!

IMyPool

IMyPool

MyDefaultPool

MyDefaultPool

需要注意到是,MyDefaultPool持有一個管道集合,基于多線程的考慮,這里使用了Vector。

MyDefaultPool需要初始化

數據庫連接池初始化

數據庫連接池需要根據外部配置文件完成數據庫驅動加載以及初始化管道的建立。

createMyPooledConnection接口實現

創建數據庫連接管道

數據庫連接池在創建管道時,應該去看一下是否達到上限,如果沒有,則可以創建。

不僅僅要創建出來,還要標示每一個管道的isBusy標志。

getMyPooledConnection接口實現

得到數據庫連接管道

這里需要注意的是:如果得不到操作管道,需要去創建管道!

getRealConnectionFromPool

getRealConnectionFromPool

第一,這里使用了synchronized,就是為了避免多線程下產生問題。

第二,要知道Connection是有超時機制的,如果我們得到的管道的Connection已經超時了怎么辦呢?

第三,得到管道后,一定注意isBusy的設置。

MyPoolFactory

單例工廠


Test測試

測試類

運行結果

result


好了,到這里,一個迷你版的數據庫連接池就有模有樣了!

早安,上班去了,再見!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,948評論 18 139
  • 對于一個簡單的數據庫應用,由于對于數據庫的訪問不是很頻繁。這時可以簡單地在需要訪問數據庫時,就新創建一個連接,用完...
    奇哥威武閱讀 1,116評論 0 8
  • 最原始的數據庫連接就是我們打開一個連接,使用過后再關閉該鏈接來釋放資源。頻繁的新建打開再關閉連接對jvm和數據庫都...
    野柳閱讀 6,431評論 1 11
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,372評論 25 708
  • 男神|你是否還在江湖中顛沛 劍指蒼穹,覆盡天下,最終敵不過汝展輕笑,把我拖入十世紅塵。 ——這封信寫給我們相忘于江...
    王爺萬安閱讀 1,030評論 32 24