這篇文章將為大家詳細(xì)講解有關(guān)數(shù)據(jù)庫(kù)連接池dbcp的原理及配置是怎樣的,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

1. 簡(jiǎn)介
DBCP(DataBase Connection Pool),數(shù)據(jù)庫(kù)連接池。是 apache 上的一個(gè) java 連接池項(xiàng)目,也是 tomcat 使用的連接池組件。單獨(dú)使用dbcp需要3個(gè)包:common-dbcp.jar,common-pool.jar,common-collections.jar由于建立數(shù)據(jù)庫(kù)連接是一個(gè)非常耗時(shí)耗資源的行為,所以通過(guò)連接池預(yù)先同數(shù)據(jù)庫(kù)建立一些連接,放在內(nèi)存中,應(yīng)用程序需要建立數(shù)據(jù)庫(kù)連接時(shí)直接到連接池中申請(qǐng)一個(gè)就行,用完后再放回去。
dbcp提供了數(shù)據(jù)庫(kù)連接池可以在spring,iBatis,hibernate中調(diào)用dbcp完成數(shù)據(jù)庫(kù)連接,框架一般都提供了dbcp連接的方法;
tomcat中也提供了dbcp的jndi設(shè)置方法,也可以不在框架中使用dbcp,單獨(dú)使用dbcp需要3個(gè)包:common-dbcp.jar,common-pool.jar,common-collections.jar
2.連接池扼要
JDBC是一套通用的Java語(yǔ)言與多種數(shù)據(jù)庫(kù)(文件)通訊的標(biāo)準(zhǔn)API。大部分針對(duì)數(shù)據(jù)庫(kù)服務(wù)器(例如Oracle, MySQL等等)的JDBC實(shí)現(xiàn)都是基于TCP/IP連接的客戶(hù)端-服務(wù)器端通訊方式。
當(dāng)我們需要執(zhí)行一個(gè)數(shù)據(jù)庫(kù)操作時(shí),有下面三步:
1. 客戶(hù)端與服務(wù)器之間建立一個(gè)數(shù)據(jù)庫(kù)連接
2. 執(zhí)行某種數(shù)據(jù)庫(kù)操作
3. 斷開(kāi)連接
如果每次處理都要走上面的三步,則應(yīng)用程序與數(shù)據(jù)庫(kù)服務(wù)器都要將大量的時(shí)間和資源消耗在數(shù)據(jù)連接的斷開(kāi)與建立上。對(duì)于某些數(shù)據(jù)庫(kù)系統(tǒng),一個(gè)數(shù)據(jù)庫(kù)連接就是一個(gè)進(jìn)程,而且數(shù)據(jù)庫(kù)連接通常要占用不少資源,如排序區(qū)/Join區(qū)等等。對(duì)于并發(fā)較大的系統(tǒng),建立一次連接然后緩存起來(lái)連續(xù)使用,直到程序結(jié)束等情況下再釋放連接,就能夠?qū)⑾到y(tǒng)資源集中在對(duì)數(shù)據(jù)庫(kù)操作的處理上,從而大大提高性能。通常情況下將數(shù)據(jù)連接的建立和斷開(kāi)委托給一種能夠數(shù)據(jù)庫(kù)連接池的組件或服務(wù)進(jìn)行管理。而DBCP, C3p0, Proxool等都是常用的開(kāi)源的連接池組件。
就好像A公司在郊外,他們公司附近沒(méi)有出租車(chē)。如果A公司有人要出去辦事,他必須打電話(huà)給出租公司訂車(chē),用完車(chē)后他還要付賬報(bào)銷(xiāo)。 這樣每個(gè)人出去一趟都必須訂車(chē)、退車(chē)和報(bào)銷(xiāo)。員工的很多時(shí)間白白花費(fèi)在這上面了。于是A公司跟出租車(chē)公司定了一個(gè)合同,出租車(chē)公司給了他們一個(gè)車(chē)隊(duì)。要用車(chē)隨時(shí)去樓下找車(chē)隊(duì)就可以了,用完了也不必結(jié)帳,A公司統(tǒng)一跟出租車(chē)公司訂車(chē)和結(jié)帳。這個(gè)車(chē)隊(duì)就好比連接池,由公司(應(yīng)用程序)來(lái)統(tǒng)一向出租車(chē)公司(數(shù)據(jù)庫(kù)服務(wù)器)訂車(chē)(建立連接)和退車(chē)(關(guān)閉連接)。
3.DBCP的配置參數(shù)以及背后的原理
Commons-dbcp連接池的配置參數(shù)比較多,也比較復(fù)雜,主要分為
· Jdbc連接參數(shù)(username, password, url, driverClassName, connectionProperties )
· 事務(wù)處理參數(shù) (defaultAutoCommit, defaultReadOnly, defaultTransactionIsolation, defaultCatalog)
· 連接池參數(shù)(詳見(jiàn)下文)
· 連接池中鏈接存活性測(cè)試參數(shù)(詳見(jiàn)下文)
· 預(yù)處理查詢(xún)池化參數(shù)(poolPreparedStatements, maxOpenPreparedStatements)
· 丟棄失效鏈接相關(guān)參數(shù)(詳見(jiàn)下文)以及一個(gè)控制是否可以正常情況下處于訪(fǎng)問(wèn)連接池包裝下的底層JDBC鏈接參數(shù)(accessToUnderlyingConnectionAllowed)
其中Jdbc鏈接參數(shù)、事務(wù)處理都跟連接池關(guān)系不大,另預(yù)處理查詢(xún)池化參數(shù)本文不詳細(xì)敘述。有關(guān)commons-dbcp的詳細(xì)參數(shù)配置信息請(qǐng)參考官方文檔。
4.連接池的配置
再用車(chē)隊(duì)來(lái)比喻,出租車(chē)公司每提供一輛車(chē)給A公司,A公司肯定要付出一定費(fèi)用。這時(shí)候維持車(chē)隊(duì)的大小就很重要了,在項(xiàng)目少用車(chē)少的時(shí)候,車(chē)隊(duì)肯定要減少,不然很多空閑車(chē)輛也要付出成本;在項(xiàng)目多用車(chē)多的時(shí)候,肯定要擴(kuò)大車(chē)隊(duì),不然車(chē)不夠用,車(chē)隊(duì)忙不過(guò)來(lái)。A公司可以簡(jiǎn)單地設(shè)地兩個(gè)閥值來(lái)動(dòng)態(tài)調(diào)節(jié)車(chē)隊(duì)中空閑的車(chē)輛數(shù)目以滿(mǎn)足動(dòng)態(tài)需求,一個(gè)是最小空閑車(chē)輛數(shù)(最小空空閑連接數(shù)(minIdle),當(dāng)剩余的空車(chē)數(shù)目小于該數(shù)目時(shí),A公司就向出租車(chē)公司請(qǐng)求加入新車(chē)。 一個(gè)是較大空閑車(chē)輛數(shù)(maxIdle),當(dāng)剩余的車(chē)大于該數(shù)目時(shí),就將剛剛用用完的車(chē)還給出租車(chē)公司從而減少車(chē)隊(duì)數(shù)量。
另外,這家出租車(chē)公司可能要為多個(gè)客戶(hù)服務(wù),要考慮能夠提供給A公司的較大的車(chē)數(shù)量,不能超過(guò)某個(gè)數(shù)量(maxActive)。所以A公司想出租車(chē)申請(qǐng)新車(chē)時(shí)首先要看下當(dāng)前正在用的車(chē)輛數(shù)目是否超過(guò)了這個(gè)較大數(shù)目,如果沒(méi)有超過(guò)那就直接申請(qǐng)新車(chē),否則可以讓申請(qǐng)者(應(yīng)用程序中執(zhí)行請(qǐng)求的線(xiàn)程)等待 (maxWait<=0, 無(wú)限等待; maxWait>0 當(dāng)?shù)却龝r(shí)間超過(guò) maxWait時(shí),失敗)。
在連接池中,這幾個(gè)參數(shù)是十分重要的,官方的說(shuō)明如下,是我們調(diào)節(jié)系統(tǒng)性能時(shí)需要認(rèn)真考慮的值。
Parameter | Default | Description |
initialSize | 0 | The initial number of connections that are created when the pool is started. Since: 1.2 |
maxActive | 8 | The maximum number of active connections that can be allocated from this pool at the same time, or non-positive for no limit. |
maxIdle | 8 | The maximum number of connections that can remain idle in the pool, without extra ones being released, or negative for no limit. |
minIdle | 0 | The minimum number of connections that can remain idle in the pool, without extra ones being created, or zero to create none. |
maxWait | indefinitely | The maximum number of milliseconds that the pool will wait (when there are no available connections) for a connection to be returned before throwing an exception, or -1 to wait indefinitely. |
實(shí)際上,Dbcp 依賴(lài)于 commons-pool 來(lái)存儲(chǔ)連接對(duì)象。 BasicDataSource默認(rèn)使用GenericObjectPool來(lái)管理連接對(duì)象。除了請(qǐng)求的線(xiàn)程會(huì)在請(qǐng)求和返回連接過(guò)程中影響池中連接實(shí)例外,另有一個(gè)跑著GenericObjectPool.Evictor類(lèi)型 (implements Runnable) 的實(shí)例的線(xiàn)程,也會(huì)影響池中的數(shù)據(jù)庫(kù)連接。
5.使用注意點(diǎn)
1) 如果maxIdle 設(shè)置太低,在高負(fù)載系統(tǒng)中,連接的打開(kāi)時(shí)間比關(guān)閉的時(shí)間快,會(huì)引起連接池中的idle的個(gè)數(shù)上升超過(guò)maxIdle,造成頻繁的銷(xiāo)毀和創(chuàng)建,類(lèi)似于jvm參數(shù)中的Xmx設(shè)置。
2) minIdle,該參數(shù)越接近maxIdle,性能越好,因?yàn)檫B接的創(chuàng)建和銷(xiāo)毀,都是需要消耗資源的,但是不能太大,因?yàn)樵跈C(jī)器很空閑的時(shí)候,也會(huì)創(chuàng)建低于minIdle個(gè)數(shù)的連接,類(lèi)似于jvm參數(shù)中的Xms設(shè)置。
3) PreparedStatements會(huì)在數(shù)據(jù)庫(kù)中保持打開(kāi)的游標(biāo),這樣會(huì)造成一個(gè)連接超出數(shù)據(jù)庫(kù)游標(biāo)限制, 特別是當(dāng)maxOpenPreparedStatements 被設(shè)置成 default (unlimited),并且應(yīng)用在一個(gè)連接上創(chuàng)建了大量不同PreparedStatements時(shí),為了避免這個(gè)問(wèn)題, maxOpenPreparedStatements 應(yīng)該設(shè)置為一個(gè)小于數(shù)據(jù)庫(kù)在一個(gè)連接上允許打開(kāi)較大游標(biāo)數(shù)。
4) poolPreparedStatements,經(jīng)過(guò)測(cè)試,開(kāi)啟后的性能沒(méi)有關(guān)閉的好,或者相差不大,沒(méi)有本質(zhì)的提高。
5) 對(duì)性能影響比較大的兩個(gè)參數(shù):
testOnBorrow:這個(gè)默認(rèn)的之是true,對(duì)性能影響很大,因?yàn)槊看螐某刂薪璩鰧?duì)象時(shí)進(jìn)行一次驗(yàn)證,系統(tǒng)開(kāi)銷(xiāo)很大,實(shí)際測(cè)試中發(fā)現(xiàn),性能差距有7-10倍的樣子。
maxIdle:如果這個(gè)參數(shù)的值比maxActive低,在高負(fù)載的情況下就會(huì)產(chǎn)生很多time_waited線(xiàn)程。根據(jù)我們的測(cè)試結(jié)果,這個(gè)值好和maxActive相同或者是設(shè)成-1。這樣才能在高并發(fā)下,應(yīng)用到數(shù)據(jù)庫(kù)的連接也是穩(wěn)定的使用固有的connection。否則dbcp會(huì)頻繁創(chuàng)建新的連接,丟棄老的連接。而創(chuàng)建連接這個(gè)操作,比驗(yàn)證還要昂貴。
由于將maxIdle設(shè)置了一個(gè)比較高的值,應(yīng)用就會(huì)在系統(tǒng)高峰時(shí)期創(chuàng)建的連接就會(huì)維持在那里。在空閑的時(shí)候這些連接就顯得有些浪費(fèi)。很多的時(shí)候數(shù)據(jù)庫(kù)機(jī)器可能會(huì)支持多個(gè)應(yīng)用,或者一個(gè)集群可能會(huì)有很多臺(tái)應(yīng)用機(jī)器。為了能這些空閑連接能夠回收,就必須設(shè)置著一個(gè)配置項(xiàng)。這個(gè)值和minEvictableIdleTimeMillis以及numTestsPerEvictionRun會(huì)影響evictor thread的行為。默認(rèn)timeBetweenEvictionRunsMillis的值是-1,就是不會(huì)運(yùn)行。但是如果它設(shè)了一個(gè)不為-1的值,那么minEvictableIdleTimeMillis就不能設(shè)置的太短,默認(rèn)的30分鐘是個(gè)不錯(cuò)的選擇。
6.配置樣例
<bean id=“dataSource” class=“org.apache.commons.dbcp.BasicDataSource” destroy- method=“close”>
<property name=“driverClassName” value=“${db_driverClassName}” />
<property name=“url” value=“${db_rul}” />
<property name=“username” value=”${db_user}” />
<property name=“password” value=”${db_passwd}” />
<property name=“maxActive” value=”${db_maxActive }” />
<property name=“initialSize” value=”${db_initialSize}” />
<property name=“maxWait” value=”${db_maxWait}” />
<property name=“maxIdle” value=”${db_maxIdle }” />
<property name=“minIdle” value=”${db_minIdle}” />
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<property name="testOnBorrow" value="false" />
<property name="testWhileIdle" value="true" />
<property name="validationQuery" value="select 1 from dual" />
<property name=“removeAbandoned” value=”true” />
<property name=“removeAbandonedTimeout” value=”180” />
</bean>
7.Mysql數(shù)據(jù)庫(kù)的配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" scope="singleton" >
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/booksystem</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>mysqladmin</value>
</property>
<property name="maxActive">
<value>10</value>
</property>
<property name="initialSize">
<value>2</value>
</property>
</bean>
</beans>
關(guān)于數(shù)據(jù)庫(kù)連接池dbcp的原理及配置是怎樣的就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
網(wǎng)站名稱(chēng):數(shù)據(jù)庫(kù)連接池dbcp的原理及配置是怎樣的-創(chuàng)新互聯(lián)
本文URL:http://www.yijiale78.com/article44/ceiohe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、定制網(wǎng)站、標(biāo)簽優(yōu)化、微信小程序、App開(kāi)發(fā)、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容