Java 數據庫連接池介紹(1)--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.49.196.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.49.196.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.49.196.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.49.196.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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM