日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

詳解數(shù)據(jù)庫連接池概念、原理、運(yùn)行機(jī)制等

 blackhappy 2019-06-18

概述

數(shù)據(jù)庫連接池是負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫連接,而不是再重新建立一個(gè)。那么其中的運(yùn)行機(jī)制又是怎樣的呢?今天主要介紹一下數(shù)據(jù)庫連接池原理和常用的連接池。


01

為什么要使用連接池

數(shù)據(jù)庫連接是一種關(guān)鍵的有限的昂貴的資源,這一點(diǎn)在多用戶的網(wǎng)頁應(yīng)用程序中體現(xiàn)得尤為突出。 一個(gè)數(shù)據(jù)庫連接對(duì)象均對(duì)應(yīng)一個(gè)物理數(shù)據(jù)庫連接,每次操作都打開一個(gè)物理連接,使用完都關(guān)閉連接,這樣造成系統(tǒng)的性能低下。

數(shù)據(jù)庫連接池的解決方案是在應(yīng)用程序啟動(dòng)時(shí)建立足夠的數(shù)據(jù)庫連接,并講這些連接組成一個(gè)連接池(簡(jiǎn)單說:在一個(gè)“池”里放了好多半成品的數(shù)據(jù)庫連接對(duì)象),由應(yīng)用程序動(dòng)態(tài)地對(duì)池中的連接進(jìn)行申請(qǐng)、使用和釋放。對(duì)于多于連接池中連接數(shù)的并發(fā)請(qǐng)求,應(yīng)該在請(qǐng)求隊(duì)列中排隊(duì)等待。并且應(yīng)用程序可以根據(jù)池中連接的使用率,動(dòng)態(tài)增加或減少池中的連接數(shù)。

連接池技術(shù)盡可能多地重用了消耗內(nèi)存地資源,大大節(jié)省了內(nèi)存,提高了服務(wù)器地服務(wù)效率,能夠支持更多的客戶服務(wù)。通過使用連接池,將大大提高程序運(yùn)行效率,同時(shí),我們可以通過其自身的管理機(jī)制來監(jiān)視數(shù)據(jù)庫連接的數(shù)量、使用情況等。


02

傳統(tǒng)的連接機(jī)制與數(shù)據(jù)庫連接池運(yùn)行機(jī)制區(qū)別

1、不使用連接池流程

下面以訪問MySQL為例,執(zhí)行一個(gè)SQL命令,如果不使用連接池,需要經(jīng)過哪些流程。

不使用數(shù)據(jù)庫連接池的步驟:

  1. TCP建立連接的三次握手
  2. MySQL認(rèn)證的三次握手
  3. 真正的SQL執(zhí)行
  4. MySQL的關(guān)閉
  5. TCP的四次握手關(guān)閉

可以看到,為了執(zhí)行一條SQL,卻多了非常多網(wǎng)絡(luò)交互。

優(yōu)點(diǎn):

  • 實(shí)現(xiàn)簡(jiǎn)單

缺點(diǎn):

  • 網(wǎng)絡(luò)IO較多
  • 數(shù)據(jù)庫的負(fù)載較高
  • 響應(yīng)時(shí)間較長(zhǎng)及QPS較低
  • 應(yīng)用頻繁的創(chuàng)建連接和關(guān)閉連接,導(dǎo)致臨時(shí)對(duì)象較多,GC頻繁
  • 在關(guān)閉連接后,會(huì)出現(xiàn)大量TIME_WAIT 的TCP狀態(tài)(在2個(gè)MSL之后關(guān)閉)

2、使用連接池流程

使用數(shù)據(jù)庫連接池的步驟:

第一次訪問的時(shí)候,需要建立連接。 但是之后的訪問,均會(huì)復(fù)用之前創(chuàng)建的連接,直接執(zhí)行SQL語句。

優(yōu)點(diǎn):

  • 較少了網(wǎng)絡(luò)開銷
  • 系統(tǒng)的性能會(huì)有一個(gè)實(shí)質(zhì)的提升
  • 沒了麻煩的TIME_WAIT狀態(tài)

03

數(shù)據(jù)庫連接池的工作原理

連接池的工作原理主要由三部分組成,分別為

  • 連接池的建立
  • 連接池中連接的使用管理
  • 連接池的關(guān)閉

第一、連接池的建立。

一般在系統(tǒng)初始化時(shí),連接池會(huì)根據(jù)系統(tǒng)配置建立,并在池中創(chuàng)建了幾個(gè)連接對(duì)象,以便使用時(shí)能從連接池中獲取。連接池中的連接不能隨意創(chuàng)建和關(guān)閉,這樣避免了連接隨意建立和關(guān)閉造成的系統(tǒng)開銷。

Java中提供了很多容器類可以方便的構(gòu)建連接池,例如Vector、Stack等。

第二、連接池的管理。

連接池管理策略是連接池機(jī)制的核心,連接池內(nèi)連接的分配和釋放對(duì)系統(tǒng)的性能有很大的影響。其管理策略是:

當(dāng)客戶請(qǐng)求數(shù)據(jù)庫連接時(shí),首先查看連接池中是否有空閑連接,如果存在空閑連接,則將連接分配給客戶使用;如果沒有空閑連接,則查看當(dāng)前所開的連接數(shù)是否已經(jīng)達(dá)到最大連接數(shù),如果沒達(dá)到就重新創(chuàng)建一個(gè)連接給請(qǐng)求的客戶;如果達(dá)到就按設(shè)定的最大等待時(shí)間進(jìn)行等待,如果超出最大等待時(shí)間,則拋出異常給客戶。

當(dāng)客戶釋放數(shù)據(jù)庫連接時(shí),先判斷該連接的引用次數(shù)是否超過了規(guī)定值,如果超過就從連接池中刪除該連接,否則保留為其他客戶服務(wù)。

該策略保證了數(shù)據(jù)庫連接的有效復(fù)用,避免頻繁的建立、釋放連接所帶來的系統(tǒng)資源開銷。

第三、連接池的關(guān)閉。

當(dāng)應(yīng)用程序退出時(shí),關(guān)閉連接池中所有的連接,釋放連接池相關(guān)的資源,該過程正好與創(chuàng)建相反。


04

連接池需要注意的點(diǎn)

1、并發(fā)問題

為了使連接管理服務(wù)具有最大的通用性,必須考慮多線程環(huán)境,即并發(fā)問題。

這個(gè)問題相對(duì)比較好解決,因?yàn)楦鱾€(gè)語言自身提供了對(duì)并發(fā)管理的支持像java,c#等等,使用synchronized(java)lock(C#)關(guān)鍵字即可確保線程是同步的。

2、事務(wù)處理

我們知道,事務(wù)具有原子性,此時(shí)要求對(duì)數(shù)據(jù)庫的操作符合“ALL-OR-NOTHING”原則,即對(duì)于一組SQL語句要么全做,要么全不做。

我們知道當(dāng)2個(gè)線程共用一個(gè)連接Connection對(duì)象,而且各自都有自己的事務(wù)要處理時(shí)候,對(duì)于連接池是一個(gè)很頭疼的問題,因?yàn)榧词笴onnection類提供了相應(yīng)的事務(wù)支持,可是我們?nèi)匀徊荒艽_定那個(gè)數(shù)據(jù)庫操作是對(duì)應(yīng)那個(gè)事務(wù)的,這是由于我們有2個(gè)線程都在進(jìn)行事務(wù)操作而引起的。

為此我們可以使用每一個(gè)事務(wù)獨(dú)占一個(gè)連接來實(shí)現(xiàn),雖然這種方法有點(diǎn)浪費(fèi)連接池資源但是可以大大降低事務(wù)管理的復(fù)雜性。

3、連接池的分配與釋放

連接池的分配與釋放,對(duì)系統(tǒng)的性能有很大的影響。合理的分配與釋放,可以提高連接的復(fù)用度,從而降低建立新連接的開銷,同時(shí)還可以加快用戶的訪問速度。

對(duì)于連接的管理可使用一個(gè)List。即把已經(jīng)創(chuàng)建的連接都放入List中去統(tǒng)一管理。每當(dāng)用戶請(qǐng)求一個(gè)連接時(shí),系統(tǒng)檢查這個(gè)List中有沒有可以分配的連接。如果有就把那個(gè)最合適的連接分配給他,如果沒有就拋出一個(gè)異常給用戶。

4、連接池的配置與維護(hù)

連接池中到底應(yīng)該放置多少連接,才能使系統(tǒng)的性能最佳?

系統(tǒng)可采取設(shè)置最小連接數(shù)(minConnection)和最大連接數(shù)(maxConnection)等參數(shù)來控制連接池中的連接。比方說,最小連接數(shù)是系統(tǒng)啟動(dòng)時(shí)連接池所創(chuàng)建的連接數(shù)。如果創(chuàng)建過多,則系統(tǒng)啟動(dòng)就慢,但創(chuàng)建后系統(tǒng)的響應(yīng)速度會(huì)很快;如果創(chuàng)建過少,則系統(tǒng)啟動(dòng)的很快,響應(yīng)起來卻慢。這樣,可以在開發(fā)時(shí),設(shè)置較小的最小連接數(shù),開發(fā)起來會(huì)快,而在系統(tǒng)實(shí)際使用時(shí)設(shè)置較大的,因?yàn)檫@樣對(duì)訪問客戶來說速度會(huì)快些。最大連接數(shù)是連接池中允許連接的最大數(shù)目,具體設(shè)置多少,要看系統(tǒng)的訪問量,可通過軟件需求上得到。

如何確保連接池中的最小連接數(shù)呢?有動(dòng)態(tài)和靜態(tài)兩種策略。動(dòng)態(tài)即每隔一定時(shí)間就對(duì)連接池進(jìn)行檢測(cè),如果發(fā)現(xiàn)連接數(shù)量小于最小連接數(shù),則補(bǔ)充相應(yīng)數(shù)量的新連接,以保證連接池的正常運(yùn)轉(zhuǎn)。靜態(tài)是發(fā)現(xiàn)空閑連接不夠時(shí)再去檢查。


總結(jié)

時(shí)至今日,雖然每個(gè)應(yīng)用(需要RDBMS的)都離不開連接池,但在實(shí)際使用的時(shí)候,連接池已經(jīng)可以做到“隱形”了。也就是說在通常情況下,連接池完成項(xiàng)目初始化配置之后,就再不需要再做任何改動(dòng)了。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多