17. JDBC連接池 — DBCP數據庫連接池

JDBC連接池

  —— DBCP數據庫連接池

1. DBCP簡介

DBCP是Apache軟件基金組織下的開源連接池實現,該連接池依賴該組織下的另一個開源系統:Common-pool。如果需要使用該連接池實現,應在系統中添加如下兩個jar文件:

  • Commons-dbcp.jar:連接池的實現
  • Commons-pool.jar:連接池實現的依賴庫

Tomcat的連接池正是採用該連接池來實現的。該數據庫連接池既可以與應用服務器整合使用,也可以有應用程序獨立使用。


2. 使用DBCP的步驟

  1. 加入jar包依賴(兩個):Commons-dbcp.jar、Commons-pool.jar
  2. 創建數據庫連接池實例(數據源)
  3. 爲數據源實例指定必須的屬性(指定可選屬性)
  4. 從數據源中獲取數據庫連接

3. 一個簡易的測試範例

pom.xml

<!-- DBCP依賴 -->
<dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.4</version>
</dependency>
<dependency>
    <groupId>commons-pool</groupId>
    <artifactId>commons-pool</artifactId>
    <version>1.6</version>
</dependency>

測試類:

package com.tqazy.test;

import org.apache.commons.dbcp.BasicDataSource;
import org.junit.Test;

import java.sql.Connection;
import java.sql.SQLException;

public class TestDbcp {

    @Test
    public void testDbcp() throws SQLException {

        // 1. 創建DBCP數據源實例
        BasicDataSource dataSource = new BasicDataSource();
        // 2. 爲數據源實例指定必須的屬性
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8");
        dataSource.setUsername("root");
        dataSource.setPassword("admin123");
        // 3. 從數據源中獲取數據庫連接
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
    }
}

結果:

結果


4. 設置數據源的可選屬性

下面代碼是在上述測試代碼的第2步之後的

此處的屬性參數和上面的必須的屬性參數都可以通過讀取Porperties文件的方式傳入

// 連接池初始化時默認創建的連接數
// (舉例:此處設置10,在連接池被創建完畢後,連接池中將會有10個空閒連接存在)
dataSource.setInitialSize(10);
// 指定最大活動連接數:在不釋放的情況下可以獲取的最大活動連接數,如果是負數表示無限制
// (舉例:此處設置20,也就是說此連接池最多提供20個連接被使用,如果同時來了21個請求連接,將會有1個請求需要排隊等待連接釋放)
dataSource.setMaxActive(20);
// 指定最大空閒連接數:在數據庫連接池中保存的最多的空閒連接數量
// (舉例:這裏設置10,假設連接池中已經有3個正被使用的連接,此時還剩下的存在的空閒連接最多不能超過10個)
dataSource.setMaxIdle(10);
// 指定最小空閒連接數:在數據庫連接池中保存的最少的空閒連接數量
// (舉例:這裏設置5,假設連接池中已經有10個正被使用的連接,此時最少還要再有5個空閒連接的存在)
dataSource.setMinIdle(5);
// 指定最大的等待時間:等待數據庫連接池爲請求分配連接的最長等待時間,超過這個時間請求將會拋異常,單位:毫秒
// (舉例:此處等待60s)
dataSource.setMaxWait(60000);
// 指定連接超時時間,默認300s(當一個連接在此時間範圍內都沒被使用過,那麼此連接便是超時連接,在ResultSet中被使用時在這裏算被使用)
dataSource.setRemoveAbandonedTimeout(300);
// 指定是否開啓收回超時連接,如果開啓,那麼噹噹前的活動連接數即將達到最大活動連接數(默認當前連接數=最大連接數-2)時,將會啓動回收機制,回收超時連接
// 如果開啓,如果連接被認爲泄露時,也會被收回。觸發機制:當前空閒連接數<2 and (當前活動連接數 > 最大活動連接數-3)
dataSource.setRemoveAbandoned(true);
// 指定將是否開啓打印。如果是true,在回收事件後,在log中打印出回收Connection的錯誤信息,包括在哪個地方用了Connection卻忘記關閉了,在調試的時候很有用
dataSource.setLogAbandoned(true);

5. 使用數據源工廠獲取數據源

此時我們把剛纔的參數全部寫在一個properties文件裏,數據源工廠類BasicDataSourceFactory直接從properties文件裏讀取參數,然後我們就可以得到一個數據源了

注意:此時我們在properties裏的參數名就不是可以隨意命名的了,必要按照指定的參數名命名(參數名參考,就是上面的set方法名用駝峯命名法反推出屬性名),否則將無法被讀到。

範例

dbcp.properties

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
username=root
password=admin123

# 連接池初始化時默認創建的連接數
initialSize=10
# 指定最大活動連接數
maxActive=20
# 指定最大空閒連接數
maxIdle=10
# 指定最小空閒連接數
minIdle=5
# 指定最大的等待時間
maxWait=60000
# 指定超時時間
removeAbandonedTimeout=300
# 指定是否開啓超時回收機制
removeAbandoned=true
# 指定是否開啓打印異常日誌
logAbandoned=true

測試方法

此方法包含在測試類TestDbcp

@Test
public void testDbcpWithDataSourceFactory() throws Exception {
    // 1. 創建一個Properties實例
    Properties properties = new Properties();
    // 2. 讀取配置文件轉變爲輸入流
    InputStream inputStream = TestDbcp.class.getClassLoader().getResourceAsStream("dbcp.properties");
    // 3. 將輸入流注入到properties實例中
    properties.load(inputStream);
    // 4. 調用BasicDataSourceFactory類的createDataSource()方法獲取數據源DataSource實例
    DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);

    // 輸出獲取到的連接和設置的數據源屬性
    System.out.println(dataSource.getConnection());
    BasicDataSource basicDataSource = (BasicDataSource) dataSource;
    System.out.println(basicDataSource.getInitialSize());
    System.out.println(basicDataSource.getMaxActive());
    System.out.println(basicDataSource.getMaxIdle());
    System.out.println(basicDataSource.getMinIdle());
    System.out.println(basicDataSource.getMaxWait());
}

結果

結果
本章結束

回到目錄


如果本文有錯誤或對本文有不理解的地方歡迎評論 ^_^

如果本文有幫助到您,可以點一下右上角的贊哦,謝謝啦

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