1.為什么需要連接池呢?
Java程序操作數(shù)據(jù)庫(kù),必須獲得一個(gè)連接Connection,實(shí)際操作中,我們要先獲得連接,使用完成后還有關(guān)閉連接。這兩個(gè)操作都比較耗時(shí)。
思考:那有沒(méi)有什么比較方便不耗時(shí)的方法呢?當(dāng)我們要用的時(shí)候只需要調(diào)用一下就ok,用完了再還回去。這樣豈不是免去了【獲得、關(guān)閉連接】節(jié)省了很多時(shí)間?那應(yīng)該怎么實(shí)現(xiàn)呢?
答疑:連接池,就是用于解決這一問(wèn)題而被需要的。連接池,將我們所需要的連接,放入池子里,形成公共連接。且該池子中的連接被調(diào)用時(shí),有且只能被一個(gè)人使用,當(dāng)該連接被歸還時(shí),即可恢復(fù)為公共連接,被別人重新調(diào)用。
2.什么是連接池
一組連接組成的一個(gè)池子(集合),稱為連接池。
接池是創(chuàng)建和管理一個(gè)連接的緩沖池的技術(shù),這些連接準(zhǔn)備好被任何需要它們的線程使用。
在描述連接池的工作原理前,先思考思考幾個(gè)問(wèn)題???
問(wèn)題1:連接池中的連接一開(kāi)始有幾個(gè)?
問(wèn)題2:如果新添加了連接,一次能添加幾個(gè)?
問(wèn)題3:如果需要的連接比池子中的連接多,該怎么辦?
問(wèn)題4:是否可以無(wú)限添加連接?
問(wèn)題5:如果都?xì)w還連接呢?
3. 問(wèn)題解答:
問(wèn)題1:一開(kāi)始連接池會(huì)進(jìn)行系統(tǒng)初始化,根據(jù)系統(tǒng)配置建立,并創(chuàng)建幾個(gè)連接對(duì)象【初始化】
問(wèn)題2:添加的新連接不能超過(guò)最大連接數(shù)
問(wèn)題3:自動(dòng)創(chuàng)建即可。
1.如果初始化只有3個(gè)連接,但我現(xiàn)在需要第4個(gè)連接,該怎么辦呢?
2.第4個(gè)連接我們可以自動(dòng)創(chuàng)建,但是隨著我們的需求越來(lái)越多,自動(dòng)創(chuàng)建連接可以無(wú)限創(chuàng)建嗎?
3.不能,因?yàn)檫B接池中有最大連接數(shù),最大連接數(shù)限制了連接的個(gè)數(shù),超過(guò)了最大連接數(shù)就會(huì)報(bào)錯(cuò),棧內(nèi)存溢出異常
問(wèn)題4:不能,有最大連接數(shù)。最大連接數(shù)限制了連接的個(gè)數(shù),不能超過(guò)最大連接數(shù),不然會(huì)報(bào)棧內(nèi)存溢出異常。
問(wèn)題5:因?yàn)橛凶钚∵B接數(shù),所有不能讓池子全部空閑,占內(nèi)存。所以池子中總是有這么幾個(gè)連接【最小連接數(shù)】在等待著被人連接使用
3. 連接池的工作原理
下面我們用圖片的形式,模擬一下連接池的工作原理
3.1詳解連接池的工作原理
3.1.1連接池的創(chuàng)建:
當(dāng)用戶需要訪問(wèn)數(shù)據(jù)庫(kù)時(shí),連接池會(huì)根據(jù)系統(tǒng)初始化,根據(jù)系統(tǒng)配置建立。并創(chuàng)建幾個(gè)連接對(duì)象,等待著被需要的用戶連接
3.1.2 連接池的管理
1.用戶根據(jù)需要去連接池獲取一個(gè)獨(dú)享連接進(jìn)行復(fù)用;
2.這時(shí)連接池接到用戶的請(qǐng)求,會(huì)從連接池中隨意移出一個(gè)空閑的連接給用戶。如果沒(méi)有空閑連接,且尚未達(dá)到連接的最大連接數(shù),就是 創(chuàng)建一個(gè)新的連接,在將新的連接交給用戶。如果沒(méi)有空閑連接,且也已經(jīng)達(dá)到最大連接數(shù)的限制,則程序會(huì)先讓其等待一段時(shí)間,如果超過(guò)了等待的時(shí)間還沒(méi)有其他空閑的連接,那么程序則會(huì)報(bào)棧內(nèi)存溢出異常。
3.當(dāng)用戶獲得連接使用完畢后,會(huì)將其連接歸還給連接池 。在歸還連接時(shí),會(huì)對(duì)其連接池中的連接進(jìn)行判斷,看是否達(dá)到最大空閑數(shù),如果已經(jīng)達(dá)到看最大空閑數(shù),已經(jīng)沒(méi)有空閑的位置了,那么就會(huì)直接將該對(duì)象丟棄。如果歸還連接時(shí),連接池中的連接小于最小空閑數(shù),則會(huì)創(chuàng)建新的對(duì)象,來(lái)保證連接數(shù)大于等于最小空閑數(shù)【最小連接數(shù)】
4.其實(shí),在我們歸還連接后,對(duì)于 大于最小空閑和小于最大空閑時(shí),會(huì)根據(jù)連接的最小空閑時(shí)間,做空閑連接檢測(cè),如果該連接空閑的時(shí)間超過(guò)了最小空閑時(shí)間,則會(huì)將其移除,清除清理掉?!敬笥谧钚】臻e連接:就是在最小連接是基礎(chǔ)上,多出來(lái)的那個(gè)或幾個(gè)連接;】【 小于最大空閑連接:就是如最大空閑數(shù)是5個(gè),現(xiàn)在卻只有4個(gè)空閑,則現(xiàn)在的空閑數(shù)就小于了最大空閑數(shù),反過(guò)來(lái)說(shuō)也就是大于最小空閑數(shù)。因?yàn)?,最大連接數(shù) = 最小連接數(shù)+最大空閑數(shù),而最小連接數(shù)其實(shí)又是最小空閑數(shù)即:最大連接數(shù)=最小空閑數(shù)+最大空閑數(shù),不管那邊發(fā)生改變都將會(huì)造成影響,天平的兩端都將不會(huì)平衡】
3.1.3 連接池的關(guān)閉
當(dāng)應(yīng)用程序關(guān)閉時(shí),會(huì)關(guān)閉連接池中的所有連接,釋放連接池中相關(guān)的資源。但也不是將所有的連接全部關(guān)閉,因?yàn)槿绻麑⑵淙筷P(guān)閉了不僅僅占內(nèi)存,而且如果下一次有用戶要進(jìn)行復(fù)用連接的時(shí)候,還降低了效率。所有連接池有一個(gè)最小連接數(shù),當(dāng)關(guān)閉程序時(shí),連接池會(huì)留下幾個(gè)連接繼續(xù)處于空閑等待狀態(tài),等待著被其他用戶連接,其他連接則會(huì)被關(guān)閉釋放資源,連接池就只剩下最小連接數(shù)個(gè)連接。
3.1.4相關(guān)詞組詳解
最大連接數(shù):意思就是在這個(gè)連接池中最大可以存放多少個(gè)連接
最小連接數(shù):意思就是在這個(gè)連接池中至少要存在多少個(gè)連接,一般系統(tǒng)進(jìn)行初始化時(shí)創(chuàng)建的連接的個(gè)數(shù)可視為最小連接數(shù)
最大空閑數(shù):意思就是在最大連接數(shù)中除去最小連接數(shù)的個(gè)數(shù),還剩下多少個(gè)連接,可視為可以最大,最多能空閑下來(lái)的連接數(shù)
4.連接池的規(guī)范
4.1JavaEE規(guī)范規(guī)定:
JavaEE規(guī)范規(guī)定:連接池必須實(shí)現(xiàn)javax.sql.DataSource 接口
接口中規(guī)定方法:getConnection()
4.2常見(jiàn)的第三方連接池
druid: 德魯伊,alibaba提供,穩(wěn)定,性能好等。
DBCP: Apache提供,tomcat內(nèi)置。
C3P0 : hibernate 框架底層使用。(等效框架MyBatis)
廣州天河區(qū)珠江新城富力盈力大廈北塔2706
020-38013166(網(wǎng)站咨詢專線)
400-001-5281 (售后服務(wù)熱線)
深圳市坂田十二橡樹(shù)莊園F1-7棟
Site/ http://www.szciya.com
E-mail/ itciya@vip.163.com
品牌服務(wù)專線:400-001-5281
長(zhǎng)沙市天心區(qū)芙蓉中路三段398號(hào)新時(shí)空大廈5樓
聯(lián)系電話/ (+86 0731)88282200
品牌服務(wù)專線/ 400-966-8830
旗下運(yùn)營(yíng)網(wǎng)站:
Copyright ? 2016 廣州思洋文化傳播有限公司,保留所有權(quán)利。 粵ICP備09033321號(hào)