Java 數據庫連接池Druid 的介紹

前言:

Druid 連接池是阿裡巴巴開源的數據庫連接池項目,Druid 為監控而生,內置強大的監控功能,監控特性不影響性能,官網地址為:https://github.com/alibaba/druid/wiki/,本文主要介紹 Druid 的基本使用,文中使用到的軟件版本:Java 1.8.0_191、Druid 1.2.8、Spring Boot 2.3.12.RELEASE。

1、配置參數

Druid 連接池的配置參數兼容 DBCP,個別配置的語意有所區別。

配置 缺省值 說明
name   配置這個屬性的意義在於,如果存在多個數據源,監控的時候可以通過名字來區分開來。如果沒有配置,將會生成一個名字,格式是:”DataSource-” + System.identityHashCode(this)。配置此屬性版本至少為 1.0.5,低於該版本設置 name 會出錯。
url   連接數據庫的 url
username   連接數據庫的用戶名
password   連接數據庫的密碼。如果你不希望密碼直接寫在配置文件中,可以使用ConfigFilter。
driverClassName 根據url自動識別 這一項可配可不配,如果不配置 Druid 會根據 url 自動識別 dbType,然後選擇相應的 driverClassName
initialSize 0 初始化時建立物理連接的個數。初始化發生在顯示調用 init 方法,或者第一次 getConnection 時
maxActive 8 最大連接池數量
maxIdle 8 已經不再使用,配置瞭也沒效果
minIdle   最小連接池數量
maxWait   獲取連接時最大等待時間,單位毫秒。配置瞭 maxWait 之後,缺省啟用公平鎖,並發效率會有所下降,如果需要可以通過配置useUnfairLock 屬性為 true 使用非公平鎖。
poolPreparedStatements false 是否緩存 preparedStatement,也就是 PSCache。PSCache 對支持遊標的數據庫性能提升巨大,比如說 oracle。在 mysql 下建議關閉。
maxPoolPreparedStatementPerConnectionSize -1 要啟用 PSCache,必須配置大於 0,當大於 0 時,poolPreparedStatements 自動觸發修改為 true。在 Druid 中,不會存在 Oracle下 PSCache 占用內存過多的問題,可以把這個數值配置大一些,比如說 100
validationQuery   用來檢測連接是否有效的 sql,要求是一個查詢語句,常用select ‘x’。如果 validationQuery 為 null,testOnBorrow、testOnReturn、testWhileIdle 都不會起作用。
validationQueryTimeout   單位:秒,檢測連接是否有效的超時時間。底層調用 jdbc Statement對象的 void setQueryTimeout(int seconds) 方法
testOnBorrow true 申請連接時執行 validationQuery 檢測連接是否有效,做瞭這個配置會降低性能。
testOnReturn false 歸還連接時執行 validationQuery 檢測連接是否有效,做瞭這個配置會降低性能。
testWhileIdle false 建議配置為 true,不影響性能,並且保證安全性。申請連接的時候檢測,如果空閑時間大於 timeBetweenEvictionRunsMillis,執行validationQuery 檢測連接是否有效。
keepAlive false
(1.0.28)
連接池中的 minIdle 數量以內的連接,空閑時間超過 minEvictableIdleTimeMillis,則會執行 keepAlive 操作。
timeBetweenEvictionRunsMillis 1分鐘(1.0.14) 有兩個含義:
1) Destroy 線程會檢測連接的間隔時間,如果連接空閑時間大於等於 minEvictableIdleTimeMillis 則關閉物理連接。
2) testWhileIdle 的判斷依據,詳細看 testWhileIdle 屬性的說明
numTestsPerEvictionRun 30分鐘(1.0.14) 不再使用,一個 DruidDataSource 隻支持一個 EvictionRun
minEvictableIdleTimeMillis   連接保持空閑而不被驅逐的最小時間
connectionInitSqls   物理連接初始化的時候執行的 sql
exceptionSorter 根據dbType自動識別 當數據庫拋出一些不可恢復的異常時,拋棄連接
filters   屬性類型是字符串,通過別名的方式配置擴展插件,常用的插件有:
監控統計用的 filter:stat
日志用的 filter:log4j
防禦 sql 註入的 filter:wall
proxyFilters   類型是List<com.alibaba.druid.filter.Filter>,如果同時配置瞭 filters 和 proxyFilters,是組合關系,並非替換關系

2、使用

2.1、直接使用

2.1.1、引入依賴

<dependency>

    <groupId>com.alibaba</groupId>

    <artifactId>druid</artifactId>

    <version>1.2.8</version>

</dependency>

2.1.2、使用例子

package com.abc.demo.general.dbpool;

import com.alibaba.druid.pool.DruidDataSource;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

public class DruidCase {

    public static void main(String[] args) {

        DruidDataSource druidDataSource = new DruidDataSource();

        Connection connection = null;

        try {

            druidDataSource.setName("測試連接池");

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

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

            druidDataSource.setUsername("root");

            druidDataSource.setPassword("123456");

            druidDataSource.setInitialSize(2);

            druidDataSource.setMinIdle(2);

            druidDataSource.setMaxActive(5);

            druidDataSource.setValidationQuery("select 1");

            druidDataSource.setTestWhileIdle(true);

            druidDataSource.setTestOnBorrow(true);

            druidDataSource.setTestOnReturn(false);

            druidDataSource.setMaxWait(6000);

            druidDataSource.setFilters("slf4j");

            connection = druidDataSource.getConnection();

            Statement st = connection.createStatement();

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

            if (rs.next()) {

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

            }

        } catch (SQLException e) {

            e.printStackTrace();

        } finally {

            close(connection);

        }

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

        druidDataSource.close();

    }

    private static void close(Connection connection) {

        if (connection != null) {

            try {

                connection.close();

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

    }

}

2.2、在 SpringBoot 中使用

2.1.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>com.alibaba</groupId>

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

        <version>1.2.8</version>

    </dependency>

    <dependency>

        <groupId>mysql</groupId>

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

    </dependency>

</dependencies>

2.1.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: com.alibaba.druid.pool.DruidDataSource

    druid:

      initial-size: 2

      min-idle: 2

      max-active: 5

      validation-query: select 1

      test-while-idle: true

      test-on-borrow: true

      test-on-return: false

      max-wait: 6000

      filter: slf4j

使用:

@Autowired

private DataSource dataSource;

2.1.3、多數據源

application.yml 配置:

spring:

  datasource:

    druid:

      db1:

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

        url: jdbc:mysql://10.140.9.11:3306/mydb?useUnicode=true&characterEncoding=UTF-8

        username: root

        password: 123456

        initial-size: 2

        min-idle: 2

        max-active: 5

        validation-query: select 1

        test-while-idle: true

        test-on-borrow: true

        test-on-return: false

        max-wait: 6000

        filter: slf4j

      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

        initial-size: 2

        min-idle: 2

        max-active: 5

        validation-query: select 1

        test-while-idle: true

        test-on-borrow: true

        test-on-return: false

        max-wait: 6000

        filter: slf4j

數據源配置類:

package com.abc.demo.config;

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;

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

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;

@Configuration

public class DataSourceConfig {

    @Primary

    @Bean("dataSource1")

    @ConfigurationProperties("spring.datasource.druid.db1")

    public DataSource dataSourceOne(){

        return DruidDataSourceBuilder.create().build();

    }



    @Bean("dataSource2")

    @ConfigurationProperties("spring.datasource.druid.db2")

    public DataSource dataSourceTwo(){

        return DruidDataSourceBuilder.create().build();

    }

}

使用:

@Autowired

@Qualifier("dataSource1")

private DataSource dataSource1;



@Autowired

@Qualifier("dataSource2")

private DataSource dataSource2;

2.1.4、開啟監控功能

Druid 內置瞭一些監控,Spring Boot 環境下通過少量配置就可開啟這些功能。

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: InsYR0ot187!

    type: com.alibaba.druid.pool.DruidDataSource

    druid:

      initial-size: 2

      min-idle: 2

      max-active: 5

      validation-query: select 1

      test-while-idle: true

      test-on-borrow: true

      test-on-return: false

      max-wait: 6000

      filter: slf4j,stat,wall #啟用日志、監控統計、防火墻功能

      web-stat-filter:    #web監控配置

        enabled: true

      stat-view-servlet:  #監控頁面配置

        enabled: true

        url-pattern: /druid/*

監控頁面:

Spring Boot 中集成 Druid 的詳細說明可以參考官網文檔:https://hub.fastgit.org/alibaba/druid/tree/master/druid-spring-boot-starter

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

推薦閱讀: