您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關數據庫連接池dbcp的原理及配置是怎樣的,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
1. 簡介
DBCP(DataBase Connection Pool),數據庫連接池。是 apache 上的一個 java 連接池項目,也是 tomcat 使用的連接池組件。單獨使用dbcp需要3個包:common-dbcp.jar,common-pool.jar,common-collections.jar由于建立數據庫連接是一個非常耗時耗資源的行為,所以通過連接池預先同數據庫建立一些連接,放在內存中,應用程序需要建立數據庫連接時直接到連接池中申請一個就行,用完后再放回去。
dbcp提供了數據庫連接池可以在spring,iBatis,hibernate中調用dbcp完成數據庫連接,框架一般都提供了dbcp連接的方法;
tomcat中也提供了dbcp的jndi設置方法,也可以不在框架中使用dbcp,單獨使用dbcp需要3個包:common-dbcp.jar,common-pool.jar,common-collections.jar
2.連接池扼要
JDBC是一套通用的Java語言與多種數據庫(文件)通訊的標準API。大部分針對數據庫服務器(例如Oracle, MySQL等等)的JDBC實現都是基于TCP/IP連接的客戶端-服務器端通訊方式。
當我們需要執行一個數據庫操作時,有下面三步:
1. 客戶端與服務器之間建立一個數據庫連接
2. 執行某種數據庫操作
3. 斷開連接
如果每次處理都要走上面的三步,則應用程序與數據庫服務器都要將大量的時間和資源消耗在數據連接的斷開與建立上。對于某些數據庫系統,一個數據庫連接就是一個進程,而且數據庫連接通常要占用不少資源,如排序區/Join區等等。對于并發較大的系統,建立一次連接然后緩存起來連續使用,直到程序結束等情況下再釋放連接,就能夠將系統資源集中在對數據庫操作的處理上,從而大大提高性能。通常情況下將數據連接的建立和斷開委托給一種能夠數據庫連接池的組件或服務進行管理。而DBCP, C3p0, Proxool等都是常用的開源的連接池組件。
就好像A公司在郊外,他們公司附近沒有出租車。如果A公司有人要出去辦事,他必須打電話給出租公司訂車,用完車后他還要付賬報銷。 這樣每個人出去一趟都必須訂車、退車和報銷。員工的很多時間白白花費在這上面了。于是A公司跟出租車公司定了一個合同,出租車公司給了他們一個車隊。要用車隨時去樓下找車隊就可以了,用完了也不必結帳,A公司統一跟出租車公司訂車和結帳。這個車隊就好比連接池,由公司(應用程序)來統一向出租車公司(數據庫服務器)訂車(建立連接)和退車(關閉連接)。
3.DBCP的配置參數以及背后的原理
Commons-dbcp連接池的配置參數比較多,也比較復雜,主要分為
· Jdbc連接參數(username, password, url, driverClassName, connectionProperties )
· 事務處理參數 (defaultAutoCommit, defaultReadOnly, defaultTransactionIsolation, defaultCatalog)
· 連接池參數(詳見下文)
· 連接池中鏈接存活性測試參數(詳見下文)
· 預處理查詢池化參數(poolPreparedStatements, maxOpenPreparedStatements)
· 丟棄失效鏈接相關參數(詳見下文)以及一個控制是否可以正常情況下處于訪問連接池包裝下的底層JDBC鏈接參數(accessToUnderlyingConnectionAllowed)
其中Jdbc鏈接參數、事務處理都跟連接池關系不大,另預處理查詢池化參數本文不詳細敘述。有關commons-dbcp的詳細參數配置信息請參考官方文檔。
4.連接池的配置
再用車隊來比喻,出租車公司每提供一輛車給A公司,A公司肯定要付出一定費用。這時候維持車隊的大小就很重要了,在項目少用車少的時候,車隊肯定要減少,不然很多空閑車輛也要付出成本;在項目多用車多的時候,肯定要擴大車隊,不然車不夠用,車隊忙不過來。A公司可以簡單地設地兩個閥值來動態調節車隊中空閑的車輛數目以滿足動態需求,一個是最小空閑車輛數(最小空空閑連接數(minIdle),當剩余的空車數目小于該數目時,A公司就向出租車公司請求加入新車。 一個是最大空閑車輛數(maxIdle),當剩余的車大于該數目時,就將剛剛用用完的車還給出租車公司從而減少車隊數量。
另外,這家出租車公司可能要為多個客戶服務,要考慮能夠提供給A公司的最大的車數量,不能超過某個數量(maxActive)。所以A公司想出租車申請新車時首先要看下當前正在用的車輛數目是否超過了這個最大數目,如果沒有超過那就直接申請新車,否則可以讓申請者(應用程序中執行請求的線程)等待 (maxWait<=0, 無限等待; maxWait>0 當等待時間超過 maxWait時,失敗)。
在連接池中,這幾個參數是十分重要的,官方的說明如下,是我們調節系統性能時需要認真考慮的值。
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. |
實際上,Dbcp 依賴于 commons-pool 來存儲連接對象。 BasicDataSource默認使用GenericObjectPool來管理連接對象。除了請求的線程會在請求和返回連接過程中影響池中連接實例外,另有一個跑著GenericObjectPool.Evictor類型 (implements Runnable) 的實例的線程,也會影響池中的數據庫連接。
5.使用注意點
1) 如果maxIdle 設置太低,在高負載系統中,連接的打開時間比關閉的時間快,會引起連接池中的idle的個數上升超過maxIdle,造成頻繁的銷毀和創建,類似于jvm參數中的Xmx設置。
2) minIdle,該參數越接近maxIdle,性能越好,因為連接的創建和銷毀,都是需要消耗資源的,但是不能太大,因為在機器很空閑的時候,也會創建低于minIdle個數的連接,類似于jvm參數中的Xms設置。
3) PreparedStatements會在數據庫中保持打開的游標,這樣會造成一個連接超出數據庫游標限制, 特別是當maxOpenPreparedStatements 被設置成 default (unlimited),并且應用在一個連接上創建了大量不同PreparedStatements時,為了避免這個問題, maxOpenPreparedStatements 應該設置為一個小于數據庫在一個連接上允許打開最大游標數。
4) poolPreparedStatements,經過測試,開啟后的性能沒有關閉的好,或者相差不大,沒有本質的提高。
5) 對性能影響比較大的兩個參數:
testOnBorrow:這個默認的之是true,對性能影響很大,因為每次從池中借出對象時進行一次驗證,系統開銷很大,實際測試中發現,性能差距有7-10倍的樣子。
maxIdle:如果這個參數的值比maxActive低,在高負載的情況下就會產生很多time_waited線程。根據我們的測試結果,這個值最好和maxActive相同或者是設成-1。這樣才能在高并發下,應用到數據庫的連接也是穩定的使用固有的connection。否則dbcp會頻繁創建新的連接,丟棄老的連接。而創建連接這個操作,比驗證還要昂貴。
由于將maxIdle設置了一個比較高的值,應用就會在系統高峰時期創建的連接就會維持在那里。在空閑的時候這些連接就顯得有些浪費。很多的時候數據庫機器可能會支持多個應用,或者一個集群可能會有很多臺應用機器。為了能這些空閑連接能夠回收,就必須設置著一個配置項。這個值和minEvictableIdleTimeMillis以及numTestsPerEvictionRun會影響evictor thread的行為。默認timeBetweenEvictionRunsMillis的值是-1,就是不會運行。但是如果它設了一個不為-1的值,那么minEvictableIdleTimeMillis就不能設置的太短,默認的30分鐘是個不錯的選擇。
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數據庫的配置:
<?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>
關于數據庫連接池dbcp的原理及配置是怎樣的就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。