Java 數據庫連接池介紹(5)--Druid 介紹


Druid 連接池是阿里巴巴開源的數據庫連接池項目,Druid 為監控而生,內置強大的監控功能,監控特性不影響性能,官網地址為:https://github.com/alibaba/druid/wiki/Druid%E8%BF%9E%E6%8E%A5%E6%B1%A0%E4%BB%8B%E7%BB%8D;本文主要介紹 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.49.196.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.49.196.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.49.196.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.49.196.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


免責聲明!

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



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