Druid連接池源碼解析(4)Connection

1 獲取Connection

DruidDataSource初始化完成后彪置,即可獲取connection與數(shù)據(jù)庫進(jìn)行交互了回官。
獲取如果有Filter,從filterChain中獲取connection,否則調(diào)用getConnectionDirect()直接獲取。
兩者返回的都是經(jīng)過封裝的DruidPooledConnection秸滴,類圖:


DruidPooledConnection.png

看下構(gòu)造函數(shù),需要傳入holder募判,從中獲取實(shí)際的Connection
擴(kuò)展定義了abandoned弧满、running身诺、disable和close的狀態(tài)
beforeExecute()和afterExecute() 處理running狀態(tài)的修改冒嫡,影響DataSource中的removeAbandoned(),執(zhí)行中的connection跳過清理
abandoned 在recycle()中影響是否回收
disable和close用處比較多涣雕,主要就是標(biāo)記連接是否可用

2 getConnection詳解

getConnectionDirect()方法開始,主要流程:

  • 死循環(huán)開始直到獲取可用鏈接為止
  • 調(diào)用getConnectionInternal獲取DruidPooledConnection
  • 如果testOnBorrow為true装处,則進(jìn)行對連接進(jìn)行校驗(yàn)
  • 如果testWhileIdle為true误债,距離上次激活時(shí)間超過timeBetweenEvictionRunsMillis,則進(jìn)行清理妄迁。
  • 如果removeAbandoned為true寝蹈,則會(huì)把連接存放在activeConnections中,清理線程會(huì)對其定期進(jìn)行處理登淘。

getConnectionInternal()方法箫老,主要流程:

  • 檢查等待線程數(shù)和錯(cuò)誤線程數(shù),超過設(shè)置了黔州,拋異常
  • createScheduler存在且可用耍鬓,標(biāo)志位createDirect置為true阔籽,重新開始循環(huán),進(jìn)入直接創(chuàng)建連接流程牲蜀,創(chuàng)建新的物理連接和holder仿耽,加鎖校驗(yàn)連接數(shù)有沒有超設(shè)置,超過便discord各薇,否則即完成創(chuàng)建
  • 調(diào)用pollLast(nanos)-有超時(shí),或者 takeLast()獲取holder君躺,如果獲取holder失敗峭判,構(gòu)建異常消息,拋異常
  • 否則棕叫,以holder為參new一個(gè)DruidPooledConnection返回

takeLast()主要就是從連接數(shù)組中獲取最后一個(gè)可用的返回

獲取到鏈接之后林螃,就可以調(diào)用conn.prepareStatement來執(zhí)行sql了

3 連接回收

DruidPooledConnection實(shí)現(xiàn)了JDBC的close方法,
從holder中獲取Datasource俺泣,判斷當(dāng)前線程是否歸屬線程疗认,不是的話,就加鎖關(guān)閉
否則直接進(jìn)行關(guān)閉
分發(fā)當(dāng)前連接關(guān)閉的事件到ConnectionEventListener
最終都到recycle()方法中進(jìn)行回收伏钠,而不是真正的關(guān)閉横漏,主要流程如下:
同樣判斷當(dāng)前線程是否歸屬線程,不是的話熟掂,就加鎖操作
將當(dāng)前線程從活躍線程組 activeConnections 中移除缎浇,主要是方便后面的丟棄或者回收的工作。
然后檢查是否需要進(jìn)行回滾赴肚,不需要繼續(xù)往下走素跺。
reset 當(dāng)前 connection 的 holder 的相關(guān)配置。
接下來是對各項(xiàng)信息進(jìn)行檢查誉券,主要是看連接是否還可以重用指厌。
鎖住然后進(jìn)行真正的回收工作,這里回收交給了 putLast 方法踊跟。
putLast 呼應(yīng)前面的takeLast踩验,就是把連接放回connections數(shù)組中

4 總結(jié)

獲取和回收連接的過程中,定義了一大堆狀態(tài)和計(jì)數(shù)器琴锭,主要用于統(tǒng)計(jì)和各種加鎖的場景晰甚,鎖的粒度已經(jīng)控制得非常精細(xì)了。比想象地要復(fù)雜很多决帖,鎖的粒度精細(xì)化有助于提高并發(fā)場景的性能厕九,但是帶來的代碼復(fù)雜度的提升不是一點(diǎn)點(diǎn)。實(shí)際工程中地回,不僅要平衡兩者扁远,還要對自己加鎖的操作俊鱼,有100%的確信度。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末畅买,一起剝皮案震驚了整個(gè)濱河市并闲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谷羞,老刑警劉巖帝火,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異湃缎,居然都是意外死亡犀填,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門嗓违,熙熙樓的掌柜王于貴愁眉苦臉地迎上來九巡,“玉大人,你說我怎么就攤上這事蹂季∶峁悖” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵偿洁,是天一觀的道長撒汉。 經(jīng)常有香客問我,道長父能,這世上最難降的妖魔是什么神凑? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮何吝,結(jié)果婚禮上溉委,老公的妹妹穿的比我還像新娘。我一直安慰自己爱榕,他們只是感情好瓣喊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著黔酥,像睡著了一般藻三。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上跪者,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天棵帽,我揣著相機(jī)與錄音,去河邊找鬼渣玲。 笑死逗概,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的忘衍。 我是一名探鬼主播逾苫,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼卿城,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了铅搓?” 一聲冷哼從身側(cè)響起瑟押,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎星掰,沒想到半個(gè)月后多望,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡氢烘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年便斥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片威始。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖像街,靈堂內(nèi)的尸體忽然破棺而出黎棠,到底是詐尸還是另有隱情,我是刑警寧澤镰绎,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布脓斩,位于F島的核電站,受9級特大地震影響畴栖,放射性物質(zhì)發(fā)生泄漏随静。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一吗讶、第九天 我趴在偏房一處隱蔽的房頂上張望燎猛。 院中可真熱鬧,春花似錦照皆、人聲如沸重绷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昭卓。三九已至,卻和暖如春瘟滨,著一層夾襖步出監(jiān)牢的瞬間候醒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工杂瘸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留倒淫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓胧沫,卻偏偏與公主長得像昌简,于是被迫代替她去往敵國和親占业。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容