Java 數據庫連接池 DBCP 的介紹

DBCP(Database connection pooling) 是 Apache 旗下 Commons 項目下的一個子項目,提供連接池功能;本文主要介紹 DBCP 的基本使用,文中使用到的軟件版本:Java 1.8.0_191、DBCP 2.9.0、Spring Boot 2.3.12.RELEASE。

1、配置參數

參數 描述
username 用戶名
password 密碼
url 連接 url
driverClassName 驅動名稱
connectionProperties

連接屬性,格式為: [propertyName=property;]*
“user” and “password” 將被除外,所以在此不需要包含這兩個屬性。

參數 默認值 描述
 defaultAutoCommit  驅動的默認值  是否自動提交
 defaultReadOnly  驅動的默認值  是否隻讀
 defaultTransactionIsolation  驅動的默認值

默認的事務隔離級別
NONE、READ_COMMITTED、READ_UNCOMMITTED、
REPEATABLE_READ、SERIALIZABLE

 defaultCatalog  

默認的 catalog。(目錄,類似於模式名,但比模式名更加抽象;
Oracle,MySQL 不支持,MS SQL Server = 數據庫名)

 cacheState  true  是否緩存狀態信息
 defaultQueryTimeout  null  默認查詢時間
 enableAutoCommitOnReturn  true  連接歸還到池時,是否設置為自動提交
 rollbackOnReturn  true

如果設置為 true,則連接歸還到連接池時,
如果 auto commit=true 且 read-only=false,則會自動執行一次 rollback()。

 參數 默認值  描述
 initialSize  0 初始連接數
 maxTotal  8 最大連接數;負數表示沒有限制
 maxIdle  8 最大空閑連接數,多餘的空閑連接將被釋放;負數表示沒有限制
 minIdle  0 最小空閑連接數,如果不足則新的空閑連接將被創建。
 maxWaitMillis  indefinitely 從連接池獲取連接,最大等待時間,超過該時間將拋出異常;-1 表示無限期
參數 默認值 描述
validationQuery  

連接池返回連接給調用者前用來校驗的查詢sql。
如果指定,則這個查詢 SQL 必須至少返回一行數據;如果沒有指定,則通過調用 isValid() 方法進行校驗。

validationQueryTimeout no timeout 驗證查詢超時時間(秒)。如果設置為正數,那麼通過 setQueryTimeOut()方法來設置查詢的超時時間。
testOnCreate false 連接創建後,是否驗證有效性
testOnBorrow true 從連接池獲取連接時,是否驗證有效性
testOnReturn false 連接返回連接池時,是否驗證有效性
testWhileIdle false 連接空閑時,是否驗證有效性;如果驗證失敗,則丟棄該連接。
timeBetweenEvictionRunsMillis -1 校驗空閑連接的時間周期,非正表示不驗證
numTestsPerEvictionRun 3 每次校驗空閑連接的個數
minEvictableIdleTimeMillis 1000 * 60 * 30 空閑連接至少多長時間後,才會被校驗
softMinEvictableIdleTimeMillis -1 空閑連接至少多長時間後,才會被校驗;還需滿足”空閑連接數>=minIdle”
maxConnLifetimeMillis -1 連接存活的最大時間;如果設置為非正數,則存活時間是無限的
logExpiredConnections true 過期的連接被連接池關閉時,是否寫日志
connectionInitSqls null 連接第一次創建時,執行的初始化 SQL
lifo true true 表示獲取連接時將返回最後返還連接池的連接(後進先出);false,則相反(先進先出)。
參數 默認值 描述
poolPreparedStatements false 預編譯語句是否池化
maxOpenPreparedStatements unlimited 最大打開的預處理語句,負數表示沒有限制
參數 默認值 描述
accessToUnderlyingConnectionAllowed false 是否允許訪問底層連接

如果允許,可以使用下面的代碼來訪問底層連接:

Connection conn = ds.getConnection();

Connection dconn = ((DelegatingConnection) conn).getInnermostDelegate();

...

conn.close()
參數 默認值 描述
removeAbandonedOnMaintenance
removeAbandonedOnBorrow
 false

是否刪除泄露的連接;如果超過一個活動連接未使用的時間超過 removeAbandonedTimeout,則是一個泄露的連接。
創建 Statement,PreparedStatement,CallableStatement 或使用這些對象執行一個查詢都會重置連接的上傳使用時間。
removeAbandonedOnMaintenance:空閑連接校驗時是否回收泄露的連接,要使啟用該設置需把 timeBetweenEvictionRunsMillis 設置為整數
removeAbandonedOnBorrow:從連接池獲取連接時是否回收泄露的連接,要使啟用該設置還需滿足 ‘getNumActive() > getMaxTotal() – 3 and getNumIdle() < 2’

removeAbandonedTimeout  300  連接泄露的超時時間(秒)
logAbandoned false  連接刪除時是否打印堆棧信息
abandonedUsageTracking false 如果設置為 true,數據庫連接每執行一個方法都會打印堆棧信息
參數 默認值 描述
fastFailValidation false

是否快速失敗驗證;如果設置為 true,當發生致命異常時,不再執行 isValid(),也不去執行驗證查詢語句。致命的異常碼有:
57P01 (ADMIN SHUTDOWN)
57P02 (CRASH SHUTDOWN)
57P03 (CANNOT CONNECT NOW)
01002 (SQL92 disconnect error)
JZ0C0 (Sybase disconnect error)
JZ0C1 (Sybase disconnect error)
Any SQL_STATE code that starts with “08”
要覆蓋默認的異常代碼,可以設置 disconnectionSqlCodes 屬性。

disconnectionSqlCodes null 自定義異常代碼
jmxName   註冊連接池的 jmx 名稱

詳細的配置說明可參考官網文檔:http://commons.apache.org/proper/commons-dbcp/configuration.html

2、使用

2.1、直接使用

2.1.1、引入依賴

<dependency>

  <groupId>org.apache.commons</groupId>

  <artifactId>commons-dbcp2</artifactId>

  <version>2.9.0</version>

</dependency>

2.1.2、使用例子

package com.abc.demo.general.dbpool;

import org.apache.commons.dbcp2.BasicDataSource;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

public class DBCPCase {

    public static void main(String[] args) {

        BasicDataSource basicDataSource = new BasicDataSource();

        basicDataSource.setUrl("jdbc:mysql://10.40.9.11:3306/mydb?useUnicode=true&characterEncoding=UTF-8");

        basicDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");

        basicDataSource.setUsername("root");

        basicDataSource.setPassword("123456");

        basicDataSource.setMaxTotal(20);

        basicDataSource.setMinIdle(5);

        Connection connection = null;

        Statement st = null;

        ResultSet rs  = null;

        try {

            connection = basicDataSource.getConnection();

            st = connection.createStatement();

            rs = st.executeQuery("select version()");

            if (rs.next()) {

                System.out.println(rs.getString(1));

            }

        } catch (SQLException e) {

            e.printStackTrace();

        } finally {

            close(connection);

        }

        try {

            //實際使用中一般是在應用啟動時初始化數據源,應用從數據源中獲取連接;並不會關閉數據源。

            basicDataSource.close();

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }



    private static void close(Connection connection) {

        if (connection != null) {

            try {

                connection.close();

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

    }

}

2.2、在 SpringBoot 中使用

2.2.1、引入依賴

<parent>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-parent</artifactId>

    <version>2.3.12.RELEASE</version>

    <relativePath />

</parent>

<dependencies>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-web</artifactId>

    </dependency>

    <dependency>

        <groupId>org.springframework</groupId>

        <artifactId>spring-jdbc</artifactId>

    </dependency>

    <dependency>

        <groupId>org.apache.commons</groupId>

        <artifactId>commons-dbcp2</artifactId>

        <version>2.9.0</version>

    </dependency>

    <dependency>

        <groupId>mysql</groupId>

        <artifactId>mysql-connector-java</artifactId>

    </dependency>

</dependencies>

2.2.2、單數據源

application.yml 配置:

spring:

  datasource:

    driver-class-name: com.mysql.cj.jdbc.Driver

    url: jdbc:mysql://10.40.9.11:3306/myDb?useUnicode=true&characterEncoding=UTF-8

    username: root

    password: 123456

    type: org.apache.commons.dbcp2.BasicDataSource

    dbcp2:

      max-total: 20

      max-idle: 5

使用:

@Autowired

private DataSource dataSource;

2.2.3、多數據源

application.yml 配置:

spring:

  datasource:

    dbcp2:

      db1:

        driver-class-name: com.mysql.cj.jdbc.Driver

        url: jdbc:mysql://10.40.9.11:3306/myDb?useUnicode=true&characterEncoding=UTF-8

        username: root

        password: 123456

        max-total: 20

        max-idle: 5

      db2:

        driver-class-name: com.mysql.cj.jdbc.Driver

        url: jdbc:mysql://10.40.9.12:3306/myDb?useUnicode=true&characterEncoding=UTF-8

        username: root

        password: 123456

        max-total: 20

        max-idle: 5

數據源配置類:

package com.abc.demo.config;

import org.apache.commons.dbcp2.BasicDataSource;

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.boot.jdbc.DataSourceBuilder;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;



import javax.sql.DataSource;



@Configuration

public class DataSourceConfig {

    @Bean("dataSource1")

    @ConfigurationProperties(prefix = "spring.datasource.dbcp2.db1")

    public DataSource dataSource1() {

        return DataSourceBuilder.create().type(BasicDataSource.class).build();

    }

    @Bean("dataSource2")

    @ConfigurationProperties(prefix = "spring.datasource.dbcp2.db2")

    public DataSource dataSource2() {

        return DataSourceBuilder.create().type(BasicDataSource.class).build();

    }

}

使用:

@Autowired

@Qualifier("dataSource1")

private DataSource dataSource1;

@Autowired

@Qualifier("dataSource2")

private DataSource dataSource2;

到此這篇關於 Java 數據庫連接池 DBCP 的介紹的文章就介紹到這瞭,更多相關 Java  連接池 DBCP內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: