1. 程式人生 > >與spring整合的幾種資料連線池

與spring整合的幾種資料連線池

資料來源概述

資料庫連線是一種關鍵的有限的昂貴的資源,這一點在多使用者的網頁應用程式中體現得尤為突出。對資料庫連線的管理能顯著影響到整個
應用程式的伸縮性和健壯性,影響到程式的效能指標。資料庫連線池正是針對這個問題提出來的。
  資料庫連線池負責分配、管理和釋放資料庫連線,它允許應用程式重複使用一個現有的資料庫連線,而再不是重新建立一個;釋放空閒時
間超過最大空閒時間的資料庫連線來避免因為沒有釋放資料庫連線而引起的資料庫連線遺漏。這項技術能明顯提高對資料庫操作的效能。
  資料庫連線池在初始化時將建立一定數量的資料庫連線放到連線池中,這些資料庫連線的數量是由最小資料庫連線數來設定的。無論這些
資料庫連線是否被使用,連線池都將一直保證至少擁有這麼多的連線數量。連線池的最大資料庫連線數量限定了這個連線池能佔有的最大連線
數,當應用程式向連線池請求的連線數超過最大連線數量時,這些請求將被加入到等待佇列中。資料庫連線池的最小連線數和最大連線數的設
置要考慮到下列幾個因素:
  1) 最小連線數是連線池一直保持的資料庫連線,所以如果應用程式對資料庫連線的使用量不大,將會有大量的資料庫連線資源被浪費;
  2) 最大連線數是連線池能申請的最大連線數,如果資料庫連線請求超過此數,後面的資料庫連線請求將被加入到等待佇列中,這會影響之
後的資料庫操作。
  3) 如果最小連線數與最大連線數相差太大,那麼最先的連線請求將會獲利,之後超過最小連線數量的連線請求等價於建立一個新的資料庫
連線。不過,這些大於最小連線數的資料庫連線在使用完不會馬上被釋放,它將被放到連線池中等待重複使用或是空閒超時後被釋放。

在spring框架中,與資料庫的連線都是通過資料來源來獲取的,而資料來源的配置一般都是使用資料連線池,只有獲取了與資料庫的通訊,才能進行資料的持久化,所以對於資料連線池,我在這裡就概述一下我使用過的一些資料連線池。

1.DBCP資料來源
DBCP類包為commons-dbcp.jar,DBCP是一個依賴 Jakarta commons-pool物件池機制的資料庫連線池,所以還應包含commons-pool.jar,所以在使用DBCP之前,要先新增上面兩個jar包依賴。

在spring配置檔案中的引用

    <!-- 載入配置檔案 -->
    <context:property-placeholder
location="classpath:db.properties" />
<!-- 配置資料來源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}"
/>
<property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <!-- 最大連線資料庫連線數 --> <property name="maxActive" value="500" /> <!-- 最大等待連線中的數量 0標識沒有限制 --> <property name="maxIdle" value="10" /> <!-- 最大等待毫秒數 超時報錯 --> <property name="maxWait" value="500" /> <property name="defaultAutoCommit" value="true" /> <!-- 是否自我中斷 --> <property name="removeAbandoned" value="true" /> <property name="removeAbandonedTimeout" value="60" /> </bean>

2.Druid
由阿里出品的一款資料庫連線池,內建了許多JDBC的元件,幾乎相容市面上所有主流的資料庫,另外還特別對oracle和mysql進行了優化,個人認為,是屬於資料庫連線池中,比較全面的一個數據庫連線池。

在spring配置檔案中的引用

    <!-- 載入配置檔案 -->
    <context:property-placeholder location="classpath:db.properties" />
    <!-- 使用jdbc驅動資料來源 -->
    <bean id="dataSource"
            class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
         <!-- 資料庫基本資訊配置 -->  
       <property name = "url" value = "${jdbc.url}" />    
       <property name = "username" value = "${jdbc.username}" />    
       <property name = "password" value = "${jdbc.password}" />    
       <property name = "driverClassName" value = "${jdbc.driverClassName}" />    
       <property name = "filters" value = "${jdbc.filters}" />    
        <!-- 最大併發連線數 -->  
       <property name = "maxActive" value = "${jdbc.maxActive}" />  
       <!-- 初始化連線數量 -->  
       <property name = "initialSize" value = "${jdbc.initialSize}" />  
       <!-- 配置獲取連線等待超時的時間 -->  
       <property name = "maxWait" value = "${jdbc.maxWait}" />  
       <!-- 最小空閒連線數 -->  
       <property name = "minIdle" value = "${jdbc.minIdle}" />    
       <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒 -->  
       <property name = "timeBetweenEvictionRunsMillis" value ="${jdbc.timeBetweenEvictionRunsMillis}" />  
       <!-- 配置一個連線在池中最小生存的時間,單位是毫秒 -->  
       <property name = "minEvictableIdleTimeMillis" value ="${jdbc.minEvictableIdleTimeMillis}" />    
       <!-- 用來檢測連線是否有效的sql,要求是一個查詢語句 -->
       <property name = "validationQuery" value = "${jdbc.validationQuery}" />    
       <!-- 申請連線的時候檢測 -->
       <property name = "testWhileIdle" value = "${jdbc.testWhileIdle}" />    
       <!-- 申請連線時執行validationQuery檢測連線是否有效,配置為true會降低效能 -->
       <property name = "testOnBorrow" value = "${jdbc.testOnBorrow}" />    
       <!-- 歸還連線時執行validationQuery檢測連線是否有效,配置為true會降低效能 -->
       <property name = "testOnReturn" value = "${jdbc.testOnReturn}" />    
       <!-- 超過時間限制是否回收 --> 
       <property name = "removeAbandoned" value = "${jdbc.removeAbandoned}" />  
       <!-- 超過時間限制多長 -->  
       <property name = "removeAbandonedTimeout" value ="${jdbc.removeAbandonedTimeout}" />  
       <!-- 關閉 abanded 連線時輸出錯誤日誌 -->     
       <property name = "logAbandoned" value = "${jdbc.logAbandoned}" /> 

    </bean>

對於Druid,我上面的屬性配置的比較全一些,如果根據註釋還是看不懂,可以在下方留言評論,或者上網搜尋。

上面就是我使用過的兩款資料庫連線池。(為啥只是用了兩種,只能說阿里的Druid做的太強大了)。

對於其他資料連線池的介紹和比較,推薦幾個博文連線: