使用DBCP配置JDBC連接池

使用DBCP配置JDBC連接池

1、DBCP簡介
DBCP(DataBase connection pool),數據庫連接池。是 apache 上的一個 java 連接池項目,也是 tomcat 使用的連接池組件。單獨使用dbcp需要2個包:commons-dbcp.jar,commons-pool.jar由於建立數據庫連接是一個非常耗時耗資源的行爲,所以通過連接池預先同數據庫建立一些連接,放在內存中,應用程序需要建立數據庫連接時直接到連接池中申請一個就行,用完後再放回去。
這裏使用的版本是dbcp2。

詳細介紹:http://commons.apache.org/proper/commons-dbcp/configuration.html

2、依賴jar包
commons-dbcp2-2.1.1.jar
commons-pool2-2.4.3.jar
commons-logging.jar

下載連接 http://www.apache.org/dist/commons/

3、代碼示例(以Oracle爲例)
1)jdbc.properties 文件

 #連接設置 
    #Oracle
    #oracle.jdbc.driver.OracleDriver
    #SqlServer
    #com.microsoft.sqlserver.jdbc.SQLServerDriver
    #MySql
    #com.microsoft.sqlserver.jdbc.MySQLServerDriver
    driverClassName=oracle.jdbc.driver.OracleDriver
    url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
    username=admin
    password=admin123

    #初始化創建的連接數,當不夠時再去創建
    initialSize=10
    #最大連接數量,連接數連不能超過該值 
    maxTotal=100
    #最大空閒連接,當空閒連接超過該值時就挨個關閉多餘的連接,但不能小於minldle
    maxIdle=60
    #最小空閒連接,空閒連接的最下值 -->
    minIdle=10
    #超時等待時間以毫秒爲單位 6000毫秒/1000等於60秒,當連接超過該時間便認爲其實空閒連接
    maxWaitMillis=60000
    #非公平鎖
    #useUnfairLock=true
    #配置間隔多久才進行一次檢測,檢測需要關閉的空閒連接,單位是毫秒
    timeBetweenEvictionRunsMillis=30000
    #配置一個連接在池中最小生存的時間,單位是毫秒
    minEvictableIdleTimeMillis=60000
    #打開PSCache,並且指定每個連接上PSCache的大小
    poolPreparedStatements=true
    maxOpenPreparedStatements=100
    #maxPoolPreparedStatementPerConnectionSize=20
    #validationQuery=
    testWhileIdle=true
    testOnBorrow=false
    testOnReturn=false
    maxConnLifetimeMillis=300000
    #連接在所指定的秒數內未使用纔會被刪除(秒)
    removeAbandonedTimeout=60
    #程序中的連接不使用後是否被連接池回收
    removeAbandoned=true
    removeAbandonedOnBorrow=true
    removeAbandonedOnMaintenance=true
    numTestsPerEvictionRun=10

    logAbandoned=true

    #配置監控統計攔截的filters
    #filters=stat
    #JDBC驅動建立連接時附帶的連接屬性屬性的格式必須爲這樣:[屬性名=property;]
    #注意:"user" 與 "password" 兩個屬性會被明確地傳遞,因此這裏不需要包含他們
    connectionProperties=useUnicode=true;characterEncoding=UTF-8
    #指定由連接池所創建的連接的自動提交(auto-commit)狀態
    defaultAutoCommit=false
    #driver default 指定由連接池所創建的連接的事務級別(TransactionIsolation)。
    #可用值爲下列之一:(詳情可見javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
    defaultTransactionIsolation=SERIALIZABLE

2)使用連接池獲取連接

 protected Connection getConnection() throws Exception {
        Connection conntion = null;
        BasicDataSource source = null;
        try {
            String filePath = super.getClass().getClassLoader().getResource("/").getPath() + "config/jdbc.properties";
            filePath = URLDecoder.decode(filePath);
            Properties prop = new Properties();
            prop.load(new FileReader(filePath));

   source = BasicDataSourceFactory.createDataSource(prop);

            if(source.getConnection().isWrapperFor(OracleConnection.class)){
                conntion = source.getConnection().unwrap(OracleConnection.class);
            }else{
                conntion = source.getConnection();
            }
        } catch (SQLException e) {
            LOGGER.error(">> " + e.toString());
            throw new RuntimeException("創建數據庫連接失敗!", e);
        } finally {
            if(source != null){
                source.close();
            }
        }
        conntion.setAutoCommit(false);
        return conntion;
    }

4、總結

maxIdle值與maxActive值應配置的接近。
當連接數超過maxIdle值後,剛剛使用完的連接就會立即被銷燬。
若maxIdle與maxActive相差較大,在高負載的系統中會導致頻繁的創建、銷燬連接,影響性能。

工作快3年, 這還是第一次寫博客,雖然有點簡單,不過也算一個好的開始。

上面例子遇到一個問題,在Oracle數據庫的環境下使用此方式配置連接池時,必須要修改Oracle數據庫默認的連接數(默認150),修改到300以上,否則每次啓動都會拋出ORA-12519: TNS:no appropriate service handler found 異常。

但是沒有找到原因,哪位同學知道 還請告知啊。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章