2025-05-23

本文主要介紹apache-dbcp基本參數配置和應用示例,dbcp目前最新版是1.4需要在jdk1.6的環境下運行,如果要在jdk1.4、1.5環境下運行,需要下載前一版本1.3,具體詳細可以查看它的官網。
本文結構目錄分兩大部分:
一、基礎參數說明
二、dbcp在spring、hibernate等應用中的配置示例
以後會陸續給出有關c3p0、proxool等相關參數介紹和應用配置實例。


[ 一 ]、參數介紹
[ 1 ]、基礎參數說明
defaultAutoCommit: 對於事務是否 autoCommit, 默認值為 true
defaultReadOnly:對於數據庫是否隻能讀取, 默認值為 false
initialSize:連接池啟動時創建的初始化連接數量(默認值為0)
driverClassName:連接數據庫所用的 JDBC Driver Class,
url: 連接數據庫的 URL
username:登陸數據庫所用的帳號
password: 登陸數據庫所用的密碼
maxActive: 連接池中可同時連接的最大的連接數,為0則表示沒有限制,默認為8
maxIdle: 連接池中最大的空閑的連接數(默認為8,設 0 為沒有限制),超過的空閑連接將被釋放,如果設置為負數表示不限制(maxIdle不能設置太小,因為假如在高負載的情況下,連接的打開時間比關閉的時間快,會引起連接池中idle的個數 上升超過maxIdle,而造成頻繁的連接銷毀和創建)
minIdle:連接池中最小的空閑的連接數(默認為0,一般可調整5),低於這個數量會被創建新的連接(該參數越接近maxIdle,性能越好,因為連接的創建和銷毀,都是需要消耗資源的;但是不能太大,因為在機器很空閑的時候,也會創建低於minidle個數的連接)
maxWait: 超過時間會丟出錯誤信息 最大等待時間(單位為 ms),當沒有可用連接時,連接池等待連接釋放的最大時間,超過該時間限制會拋出異常,如果設置-1表示無限等待(默認為-1,一般可調整為60000ms,避免因線程池不夠用,而導致請求被無限制掛起)
validationQuery: 驗證連接是否成功, SQL SELECT 指令至少要返回一行
removeAbandoned:超過removeAbandonedTimeout時間後,是否進行沒用連接的回收(默認為false)
removeAbandonedTimeout: 超過時間限制,回收五用的連接(默認為 300秒),removeAbandoned 必須為 true
logAbandoned: 是否記錄中斷事件, 默認為 false
一般優化的配置示例:
Xml代碼 
<bean id=”dbcpDataSource” 
        class=”org.apache.commons.dbcp.BasicDataSource” 
        destroy-method=”close”> 
        <property name=”driverClassName” 
            value=”${jdbc.driverClassName}” /> 
        <property name=”url” value=”${jdbc.url}” /> 
        <property name=”username” value=”${jdbc.username}” /> 
        <property name=”password” value=”${jdbc.password}” /> 
        <property name=”maxActive” value=”20″ /> 
        <property name=”initialSize” value=”1″ /> 
        <property name=”maxWait” value=”60000″ /> 
        <property name=”maxIdle” value=”15″ /> 
        <property name=”minIdle” value=”5″ /> 
        <property name=”removeAbandoned” value=”true” /> 
        <property name=”removeAbandonedTimeout” value=”180″ /> 
        <property name=”connectionProperties”> 
            <value>clientEncoding=utf-8</value> 
        </property> 
    </bean> 



[ 2 ]、validate配置參數說明
minEvictableIdleTimeMillis:大於0 ,進行連接空閑時間判斷,或為0,對空閑的連接不進行驗證;默認30分鐘
timeBetweenEvictionRunsMillis:失效檢查線程運行時間間隔,如果小於等於0,不會啟動檢查線程,默認-1
testOnBorrow:在進行borrowObject進行處理時,對拿到的connection進行validateObject校驗,默認為false
testOnReturn:就是在進行returnObject對返回的connection進行validateObject校驗,默認為false
testWhileIdle:GenericObjectPool中針對pool管理,起瞭一個Evict的TimerTask定時線程進行控制(可通過設置參數timeBetweenEvictionRunsMillis>0),定時對線程池中的鏈接進行validateObject校驗,對無效的鏈接進行關閉後,會調用ensureMinIdle,適當建立鏈接保證最小的minIdle連接數,默認為false
numTestsPerEvictionRun:代表每次檢查鏈接的數量,建議設置和maxActive一樣大,這樣每次可以有效檢查所有的鏈接.
validateQuery, 代表檢查的sql
validateQueryTimeout, 代表在執行檢查時,通過statement設置,statement.setQueryTimeout(validationQueryTimeout)
配置示例:
Xml代碼 
<property name=”testWhileIdle” value=”true” /> 
<property name=”testOnBorrow” value=”false” /> 
<property name=”testOnReturn” value=”false” /> 
<property name=”validationQuery”> 
    <value>select sysdate from dual</value> 
</property> 
<property name=”validationQueryTimeout” value=”1″ /> 
<property name=”timeBetweenEvictionRunsMillis” value=”30000″ /> 
<property name=”numTestsPerEvictionRun” value=”20″ /> 


[ 二 ]、dbcp在spring、hibernate等應用中的配置示例
dbcp.jdbc.properties
Java代碼 
jdbc.driverClassName=com.mysql.jdbc.Driver 
jdbc.url=jdbc:mysql://localhost/iecms 
jdbc.username=root 
jdbc.password= 


[ 1 ]、最基本的應用
Java代碼 
package michael.jdbc.dbcp; 
 
import javax.sql.DataSource; 
import java.sql.Connection; 
import java.sql.Statement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.Properties; 
 
import org.apache.commons.dbcp.BasicDataSource; 
 
/**
 * @see http://sjsky.iteye.com
 * @author michael sjsky007@gmail.com
 */ 
public class DbcpDataSourceExample { 
 
    /**
     * @param args
     */ 
    public static void main(String[] args) { 
 
        String testSql = “select * from TB_MYTEST”; 
        String cfgFileName = “dbcp.jdbc.properties”; 
 
        System.out.println(“Setting up data source.”); 
        DataSource dataSource = setupDataSource(cfgFileName); 
        System.out.println(“dataSource Done.”); 
 
        printDataSourceStats(dataSource); 
 
        Connection conn = null; 
        Statement stmt = null; 
        ResultSet rset = null; 
 
        try { 
            System.out.println(“Creating connection start.”); 
            conn = dataSource.getConnection(); 
 
            System.out.println(“Creating statement start.”); 
            stmt = conn.createStatement(); 
 
            System.out.println(“Executing statement start.”); 
            rset = stmt.executeQue

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *