回答完數據庫連接池原理,面試官跪着求我入職他們公司 被面試官虐待的經歷 爲什麼要用連接池 線程池概念 詳細流程 傳統連接和連接池區別 連接池常用參數詳解 最後

被面試官虐待的經歷

來自面試官發自靈魂深處的拷問:說說你對連接池的理解;
一臉懵逼的我:“額~ ~ ~,連接池是把數據庫的連接統一進行管理,做到連接複用的目的”;
咄咄逼人的面試官:“嗯,沒錯,還有呢? 說說連接池的原理”;
一臉懵逼的我:“還有嗎?額~~,不清楚耶”;
咄咄逼人的面試官:“你簡歷上寫着精通這,精通那,但我感覺你只是會用,連熟悉都說不上,是誰給你的自信來面試高級架構師職位的? 下次面試把簡歷寫真實一點,回去吧!一會趕不上二路汽車了!”;

以上是博主之前真實的面試經歷,一點都不誇張,每當面試官問了好幾個問題都回答不上來的時候,你就能感受到面試官充滿嫌棄的表情,而你又是一副走也不是,留也不是的尷尬局面,只能安靜地坐在面試間被盡情的蹂躪;從這以後,我就發奮圖強,勢必要日後令人刮目相看,於是乎,在家日以夜繼地學習,中國經過簡單的半小時研究,終於讓我掌握了數據庫連接池的原理;

爲什麼要用連接池

要回答這個問題,我們先來了解一下以前的項目是怎樣連接數據庫的,在以前的項目,因爲併發量較小, 所以每次請求都會創建一個連接,使用完之後在銷燬連接,這樣的小項目用起來似乎沒什麼太大影響;

但現在是什麼時候啊?都21世紀了,人家併發量都是過億級了,這樣頻繁地開啓關閉連接,對數據庫來說,都是極大的消耗,並且每次連接數據庫是需要時間的,因爲數據庫需要驗證你的登錄賬號和密碼,最終的影響就是會造成系統效率低下,響應速度慢。

爲了解決這一難題,數據庫連接池就發明出來了,連接池的解決方案就是在系統啓動時先創建好一定數據的連接,放在空閒線程池中,需要用到的時候從池中取出使用,用完之後在放回空閒線程池,空閒的連接就靜靜地躺在隊列裏面;

這項技術極大地減少了連接數據庫時的消耗,大大地減少了內存的使用;最重要的是做到連接複用機制;池中的連接都由應用程序來管理,決定什麼時候創建連接和釋放連接;先看看一個大概的流程圖,然後我們仔細講

線程池概念

  • 空閒連接池 : 已創建的連接池,當後端需要訪問數據庫時,先判斷空閒連接池有無可用的連接,如果有,會從空閒連接池中取出一個連接,變爲活動連接,用完後會放回空閒連接池
  • 活動連接池:正在使用的連接
  • 最大連接數:最多能創建幾個連接

詳細流程

當客戶請求數據庫連接時,首先查看連接池中是否有空閒連接,如果存在空閒連接,則將連接分配給客戶使用;如果沒有空閒連接,則查看當前所開的連接數是否已經達到最大連接數,如果沒達到就重新創建一個連接給請求的客戶;如果達到就按設定的最大等待時間進行等待,如果超出最大等待時間,則拋出異常給客戶。具體流程走向如下圖

傳統連接和連接池區別

1、傳統連接方式

傳統連接方式是每一個請求就使用去連接一次數據庫,以mysql爲例,當服務器收到請求時,服務器就會開啓一個連接,連到數據庫。

我們知道java代碼連接數據庫的時候使用的是http協議,首先需要建立tcp連接,然後再經過數據庫的連接;最後纔是執行sql語句,執行完後還得關閉數據庫和http的連接;光連接的開銷就不得了;下圖是不使用連接池的流程圖

2、連接池方式

當我們使用了連接池後,就可以省去又長又臭又重的http連接,因爲連接已經啓動好並且放在空閒線程裏面了,所以我麼們需要用的時候直接去隊列裏面取就好了,省去了大量連接的資源消耗;既節省了網絡開銷,又提升了響應速度,系統的性能成倍數提升;

連接池常用參數詳解

  • initialSize:初始化連接數,也就是系統一開始啓動時將會創建的連接數量;
  • MinIdle:最小連接數,也就是空閒連接池,當系統啓用後,連接池中的數量將不少於 MinIdle 的數量;如果發現空閒線程池中的數量不足,那麼會啓用新的連接器放入池中;
  • MaxActive :連接池最大連接數量,每次使用完連接都會判斷池中的連接數是否超過最大連接數, 如果創建的連接數量達到最大連接數,將會回收剩餘空閒的連接,確保不會超過最大連接數;
  • maxWait:獲取連接時最大等待時間,單位毫秒。超時將拋出異常;

最後

其實連接池還是比較簡單的,如果你學過java的線程池,那麼你會更容易理解連接池的原理,知道思路之後,相信大家肯定也可以自己手寫一個連接池出來!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章