Java 数据库连接池Druid 的介绍

Java 数据库连接池Druid 的介绍,Druid是一个JDBC组件,它包括三部分: DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系。 DruidDataSource 高效可管理的数据库连接池

Druid 连接池是阿里巴巴开源的数据库连接池项目,Druid 为监控而生,内置强大的监控功能,监控特性不影响性能,官网地址为:https://github.com/alibaba/druid/wiki/

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.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值