最近在看書,其中有一段是:html
相信有大佬已經能看得出來這是《企業IT架構轉型之道》這本書了(這是一本不錯的書,推薦工做時長>2年的軟件人員能夠看看)~~java
對於紅色框內的那段文字,我有兩個概念不是很明白:mysql
一、應用實例指的是什麼?sql
二、鏈接池是什麼?在何時發揮做用?以及何時被配置上?數據庫
帶着疑問,我查閱了大量的資料,也問了大神,大概弄清楚了。設計模式
應用實例指的是一個應用須要鏈接數據庫的後臺(如淘寶後臺就是一個應用實例)。tomcat
說到Java中的鏈接池,咱們不可避免的要說到數據庫鏈接池(connection pool),Java鏈接池就是數據庫鏈接池在Java上的應用。網絡
你們都知道,對於資源共享,有一個頗有名的設計模式-資源池(Resource Pool)。網絡上對於資源池的解釋是這樣的:架構
簡言之,鏈接池是將已經建立好的鏈接保存在池中,當檢測到有請求時,直接使用建立好的鏈接對數據庫進行訪問,這樣能夠節省建立鏈接和銷燬鏈接所帶來的的時間成本。eclipse
在數據庫鏈接池中,涉及到三個主要的參數:
- 最大維持鏈接數:沒有任何請求時在鏈接池中能夠存在的鏈接數
- 最大鏈接數:鏈接池中最多能夠存在的鏈接個數。
- 最大等待時間:當斷開鏈接時,超過最大維持鏈接數的鏈接不會立刻銷燬,最大等待時間事後它纔會銷燬。
參數使用的場景實例以下:
當最大維持鏈接數是10,最大鏈接數是20,最大等待時間是10000(毫秒)時,
訪問數據庫,調用鏈接池的過程是:最開始在鏈接池中有10個鏈接(最大鏈接數),當有用戶申請鏈接時,其將一個鏈接分配用戶,直到鏈接池中的10個鏈接全都分配出去。當第11個用戶申請鏈接時,它將建立第11個鏈接並分配給該用戶,直到把第20個鏈接(最大鏈接數)分配給第20個用戶。
當第21個用戶申請鏈接時,它須要等待,直到前面的20個用戶中某一個斷開了鏈接,纔會把那個鏈接分配給第21個用戶,當用戶斷開鏈接時(第11至20個鏈接),該鏈接不會馬上被釋放而是須要等待10000毫秒(最大等待時間),才被釋放,當沒有用戶鏈接時,鏈接池內還保持10個鏈接。
至此,數據庫鏈接池是什麼以及在何時發揮做用基本很清楚了。如今來討論下他怎麼被配置。
在應用的META-INF文件夾下建立一個context.xml配置文件,並在其中添加<Context>標籤進行配置,但,這種方式生成的數據源只能用於當前應用。
<?xml version="1.0" encoding="utf-8" ?> <Context> <Resource name="jdbc/EmployeeDB" 當前建立數據鏈接池的名字,本身定義,在使用jndi容器獲取該數據源對象時會用到 auth="Container" 做者 type="javax.sql.DataSource" 對象類型這裏固定爲DataSource便可 username="dbusername" 數據庫鏈接的用戶名 password="dbpassword" 鏈接密碼 driverClassName="com.mysql.jdbc.Driver" 驅動 url="jdbc:mysql:///dbcptest" 數據庫的url maxActive="8" DBCP的參數,DBCP的其餘參數能夠加入 maxIdle="4"/> </Context>
在tomcat啓動時,會逐個加載其中的應用,當其加載到當前應用時,會加載到 META-INF文件夾下的 context.xml 配置文件,此時tomcat會根據其中的配置信息爲當前應用建立一個數據庫鏈接池,該數據庫鏈接池只能用於當前應用,tomcat下的其餘應用沒法使用該數據庫鏈接池。
附加:雖然數據庫鏈接池能夠幫助咱們節省大量的時間成本,但在開發中,使用鏈接池時若沒有關閉鏈接(調用鏈接的close方法)會出現「鏈接池疲勞的錯誤」。