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
initialSize0初始化时建立物理连接的个数。初始化发生在显示调用 init 方法,或者第一次 getConnection 时
maxActive8最大连接池数量
maxIdle8已经不再使用,配置了也没效果
minIdle最小连接池数量
maxWait获取连接时最大等待时间,单位毫秒。配置了 maxWait 之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock 属性为 true 使用非公平锁。
poolPreparedStatementsfalse是否缓存 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) 方法
testOnBorrowtrue申请连接时执行 validationQuery 检测连接是否有效,做了这个配置会降低性能。
testOnReturnfalse归还连接时执行 validationQuery 检测连接是否有效,做了这个配置会降低性能。
testWhileIdlefalse建议配置为 true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于 timeBetweenEvictionRunsMillis,执行validationQuery 检测连接是否有效。
keepAlivefalse
(1.0.28)
连接池中的 minIdle 数量以内的连接,空闲时间超过 minEvictableIdleTimeMillis,则会执行 keepAlive 操作。
timeBetweenEvictionRunsMillis1分钟(1.0.14)有两个含义:
1) Destroy 线程会检测连接的间隔时间,如果连接空闲时间大于等于 minEvictableIdleTimeMillis 则关闭物理连接。
2) testWhileIdle 的判断依据,详细看 testWhileIdle 属性的说明
numTestsPerEvictionRun30分钟(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

标签: 数据库连接池

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Druid连接池是一种高效、可扩展的Java数据库连接池,官方文档详细地介绍了Druid连接池的功能、配置和使用方法。 首先,文档介绍了Druid连接池的特点。Druid连接池具有高度可配置性,可以通过配置文件或者代码来设置连接池的参数,以适应不同的场景和需求。它还支持监控统计功能,可以实时监控连接池的使用情况,并提供详细信息和统计报表。此外,Druid连接池还支持防止恶意攻击、SQL注入等安全措施,以保护数据库的安全。 接下来,文档介绍了Druid连接池的配置方法。我们可以通过在配置文件中设置各种参数来配置连接池,例如设置初始化连接数、最大连接数、最小空闲连接数等。我们还可以配置连接的生命周期和验证策略,以及SQL统计功能等。Druid连接池还支持使用代码来动态配置连接池,这样可以更灵活地调整连接池的参数。 然后,文档介绍了使用Druid连接池的方法。我们可以通过通过简单的几行代码来获取连接,如"DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);"。获取连接后,可以使用该连接来执行SQL操作,并在完成后释放连接。Druid连接池还支持连接的自动扩展和收缩功能,可以根据连接的需求动态地增加或释放连接。 最后,文档介绍了Druid连接池的监控统计功能。我们可以通过配置一些参数来开启监控功能,并可以通过配置URL来访问监控的信息。监控信息包括连接数量、连接状态、执行的SQL语句等详细信息,以便我们能够全面了解连接池的使用情况,及时发现和解决问题。 总而言之,Druid连接池官方文档详细介绍了Druid连接池的功能、配置和使用方法,帮助用户更好地了解和使用Druid连接池,提高系统的数据库访问效率和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值