Spring Boot 使用 Druid 连接池详解

Posted 爱路宝7A

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot 使用 Druid 连接池详解相关的知识,希望对你有一定的参考价值。

Spring Boot 使用 Druid 连接池详解

Alibaba Druid 是一个 JDBC 组件库,包含数据库连接池、SQL Parser 等组件,被大量业务和技术产品使用或集成,经历过严苛的线上业务场景考验,是值得信赖的技术产品。Druid Spring Boot Starter 用于帮助你在 Spring Boot 项目中轻松集成 Druid 数据库连接池和监控。

https://github.com/alibaba/druid

快速使用

1)在你的 Spring Boot 项目中添加依赖配置:

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>1.2.14</version>
</dependency>

2)添加数据源配置:

## Spring DruidDataSource Configuration
# spring.datasource.druid.enable=true
# spring.datasource.druid.name=DataSource-1
# spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.url=jdbc:mysql://localhost:3306/dbname?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&autoReconnectForPools=true&noAccessToProcedureBodies=true&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
spring.datasource.druid.username=root
spring.datasource.druid.password=123456
spring.datasource.druid.initial-size=10
spring.datasource.druid.min-idle=10
spring.datasource.druid.max-active=100
spring.datasource.druid.max-wait=6000
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.test-on-return=false
spring.datasource.druid.validation-query=select 1
spring.datasource.druid.time-between-eviction-runs-millis=30000
spring.datasource.druid.min-evictable-idle-time-millis=600000
spring.datasource.druid.max-evictable-idle-time-millis=900000
spring.datasource.druid.keep-alive=true

3)Druid 支持根据 url 来自动探测 JDBC 驱动, 已在 druid-xxx.jar/META-INF/druid-driver.properties 属性文件中定义。

jdbc:derby:=org.apache.derby.jdbc.EmbeddedDriver	 
jdbc:mysql:=com.mysql.jdbc.Driver
jdbc:log4jdbc:=net.sf.log4jdbc.DriverSpy
jdbc:oracle:=oracle.jdbc.driver.OracleDriver
jdbc:microsoft:=com.microsoft.jdbc.sqlserver.SQLServerDriver	 
jdbc:jtds:=net.sourceforge.jtds.jdbc.Driver	 
jdbc:postgresql:=org.postgresql.Driver	 
jdbc:fake:=com.alibaba.druid.mock.MockDriver	 
jdbc:hsqldb:=org.hsqldb.jdbcDriver	 
jdbc:db2:=COM.ibm.db2.jdbc.app.DB2Driver
jdbc:sqlite:=org.sqlite.JDBC	 
jdbc:ingres:=com.ingres.jdbc.IngresDriver	 
jdbc:h2:=org.h2.Driver	 
jdbc:mckoi:=com.mckoi.JDBCDriver
jdbc:clickhouse:=ru.yandex.clickhouse.ClickHouseDriver
jdbc:highgo:=com.highgo.jdbc.Driver

如果未能自动探测 JDBC 驱动,则需指定驱动类:

spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver

连接池配置详解

Druid Spring Boot Starter 配置属性的名称完全遵照 Druid,你可以通过 Spring Boot 配置文件来配置 Druid 数据库连接池和监控。

  • JDBC 配置:
# 单数据源时,Druid 兼容 JDBC 的配置如下:
spring.datasource.druid.url= # 或spring.datasource.url= 
spring.datasource.druid.username= # 或spring.datasource.username=
spring.datasource.druid.password= # 或spring.datasource.password=
spring.datasource.druid.driver-class-name= #或 spring.datasource.driver-class-name=
  • 连接池配置详解:
# 启动 Druid 连接池,默认开启
# 多数据源配置时,该参数不生效
spring.datasource.druid.enable=true

# 指定驱动类名,默认从 URL 中自动探测
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver

# 设置数据库连接
spring.datasource.druid.url=jdbc:mysql://localhost:3306/dbname

# 设置数据库用户名
spring.datasource.druid.username=root

# 设置数据库密码
spring.datasource.druid.password=123456

# 允许访问底层连接,默认值:true
spring.datasource.druid.access-to-underlying-connection-allowed=true

# 启用异步关闭连接,默认值:false
# 如果 removeAbandoned = true,则自动开启。
spring.datasource.druid.async-close-connection-enable=false

# 开启异步初始化,默认值:false
spring.datasource.druid.async-init=false

# 失败后跳过即用于失败重连,默认值:false
# true 表示向数据库请求连接失败后,就算后端数据库恢复正常也不进行重连,因此一定要配置 false
spring.datasource.druid.break-after-acquire-failure=false

# 检查SQL执行时间,默认值:false
spring.datasource.druid.check-execute-time=false

# 启动清除过滤器,默认值:true
spring.datasource.druid.clear-filters-enable=true

# 连接属性配置,多个用英文分号隔开
spring.datasource.druid.connect-properties=

# 连接出错尝试几次重新连接,默认值:1
spring.datasource.druid.connection-error-retry-attempts=1

# 指定数据库类型,默认自动探测
spring.datasource.druid.db-type=

# 事务是否自动提交,默认值:true
spring.datasource.druid.default-auto-commit=true

# 指定连接默认的 catalog,默认未设置
spring.datasource.druid.default-catalog=

# 是否设置默认连接只读,默认未设置
spring.datasource.druid.default-read-only=true

# 指定连接的事务的默认隔离级别,默认未设置。
# -1 数据库默认隔离级别
# 1 未提交读
# 2 读写提交
# 4 可重复读
# 8 串行化
spring.datasource.druid.default-transaction-isolation=

# 当创建连接池时,创建失败后是否立即抛异常,默认值:false
spring.datasource.druid.fail-fast=false

# 设置过滤器别名,多个使用英文逗号隔开,默认值:default
# 生产环境不建议使用其他过滤器。
spring.datasource.druid.filters=stat

# 初始化异常则抛出异常,默认值:true
spring.datasource.druid.init-exception-throw=true

# 初始化全局变量,默认值:false
spring.datasource.druid.init-global-variants=false

# 初始化变量,默认值:false
spring.datasource.druid.init-variants=false

# 初始化连接池大小,默认值:0
# 建议与 minIdle 大小保持一致
spring.datasource.druid.initial-size=10

# 开启 keepAlive 操作,默认值:false
# 打开 keepAlive 之后的效果
# 1、初始化连接池时会填充到 minIdle 数量。
# 2、连接池中的 minIdle 数量以内的连接,空闲时间超过 minEvictableIdleTimeMillis,则会执行 keepAlive 操作。
# 3、当网络断开等原因产生的由 ExceptionSorter 检测出来的死连接被清除后,自动补充连接到 minIdle 数量。
spring.datasource.druid.keep-alive=true

# 两次 keepAlive 操作的时间间隔,默认值:120000(单位毫秒)
spring.datasource.druid.keep-alive-between-time-millis=120000

# 指定连接数据库的超时时间,默认无限制(单位秒)
spring.datasource.druid.login-timeout=

# 设置最大连接数,默认值:8
spring.datasource.druid.max-active=100

# 最大创建任务数,默认值:3
spring.datasource.druid.max-create-task-count=3

# 连接保持空闲而不被驱逐的最大时间,默认值:1800000毫秒=30分钟
spring.datasource.druid.max-evictable-idle-time-millis=1800000

# 最大打开的 prepared-statement 数量,默认值:-1(无限制)
spring.datasource.druid.max-open-prepared-statements=-1

# 设置最大等待时间,默认值:-1(单位毫秒)
spring.datasource.druid.max-wait=6000

# 允许的最大线程等待数,默认值:-1(无限制)
spring.datasource.druid.max-wait-thread-count=-1

# 销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接即一个连接在池中最小生存的时间。默认值:1800000毫秒=30分钟
spring.datasource.druid.min-evictable-idle-time-millis=1800000

# 设置最小连接数,默认值:0
spring.datasource.druid.min-idle=10

# 指定连接池名称,未设置则随机生成:`"DataSource-" + System.identityHashCode(this);`
spring.datasource.druid.name=DataSource-1

# 设置获取连接时的重试次数,默认值:0
spring.datasource.druid.not-full-timeout-retry-count=0

# 用于控制当 OnFatalError 发生时最大使用连接数量,用于控制异常发生时并发执行SQL的数量,减轻数据库恢复的压力。默认值:0
spring.datasource.druid.on-fatal-error-max-active=0

# 是否是 Oracle 数据库,默认值:false
spring.datasource.druid.oracle=false

# 物理最大连接数,默认值:-1(无限制)
spring.datasource.druid.phy-max-use-count=-1

# 物理超时时间,默认值:-1(无限制,单位毫秒)
spring.datasource.druid.phy-timeout-millis=-1

# oracle 设为 true,mysql 设为 false。分库分表较多推荐设置为 false,默认值:false
spring.datasource.druid.pool-prepared-statements=false

# 打开PSCache,并且指定每个连接上PSCache的大小,默认值:10
# poolPreparedStatements 默认为 false,属性文件中将 poolPreparedStatements 设置为 true,则该值生效。
# 若属性文件中设置该值且大于0时,poolPreparedStatements 会自动设置为 true。
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=10

# 查询超时时间,默认值:0(无限制,单位秒)
spring.datasource.druid.query-timeout=0

# 指定当连接超过废弃超时时间时,是否立刻删除该连接,默认值:false
spring.datasource.druid.remove-abandoned=false

# 废弃连接超时指定时间的连接,默认值:5分钟
spring.datasource.druid.remove-abandoned-timeout-millis=300 * 1000

# 共享预处理语句,默认值:false
spring.datasource.druid.share-prepared-statements=false

# 从连接池借用连接时,是否测试该连接,默认值:false
spring.datasource.druid.test-on-borrow=false

# 申请连接时检测,如果空闲时间大于 timeBetweenEvictionRunsMillis,执行 validationQuery 检测连接是否有效。默认值:false
spring.datasource.druid.test-on-return=false

# 归还连接时会执行 validationQuery 检测连接是否有效,默认值:true
spring.datasource.druid.test-while-idle=true

# 指定两次错误连接的最大时间间隔,默认值:500毫秒
spring.datasource.druid.time-between-connect-error-millis=500

# 既作为检测的间隔时间又作为 testWhileIdel 执行的依据即此值决定是否空闲,因此此值一定要设置合理。
# 即一个空闲线程,最大的生成时间,检测需要关闭的空闲连接。默认值:60000毫秒
spring.datasource.druid.time-between-eviction-runs-millis=30000

# 事务查询超时时间,默认值:0(小于或等于 0 时取 query-timeout 的值)
spring.datasource.druid.transaction-query-timeout=0

# 事务时间阈值,默认值:0(单位毫秒)
spring.datasource.druid.transaction-threshold-millis=0

# 使用非公平锁,默认未设置
spring.datasource.druid.use-unfair-lock=true

# 使用 Oracle 隐式缓存,默认值:true
spring.datasource.druid.use-oracle-implicit-cache=true

# 指定连接的有效检查类,默认未设置
spring.datasource.druid.valid-connection-checker=

# 用来检测连接是否有效的 SQL 必须是一个查询语句,默认未设
spring.datasource.druid.validation-query=select 1

# 检测连接是否有效的超时时间,默认值:-1(单位秒)
spring.datasource.druid.validation-query-timeout=-1

过滤器配置

Druid 内置的过滤器类及别名,已在 druid-xxx.jar/META-INF/druid-filter.properties 属性文件中定义:

druid.filters.default=com.alibaba.druid.filter.stat.StatFilter
druid.filters.stat=com.alibaba.druid.filter.stat.StatFilter
druid.filters.mergeStat=com.alibaba.druid.filter.stat.MergeStatFilter
druid.filters.counter=com.alibaba.druid.filter.stat.StatFilter
druid.filters.encoding=com.alibaba.druid.filter.encoding.EncodingConvertFilter
druid.filters.log4j=com.alibaba.druid.filter.logging.Log4jFilter
druid.filters.log4j2=com.alibaba.druid.filter.logging.Log4j2Filter
druid.filters.slf4j=com.alibaba.druid.filter.logging.Slf4jLogFilter
druid.filters.commonlogging=com.alibaba.druid.filter.logging.CommonsLogFilter
druid.filters.commonLogging=com.alibaba.druid.filter.logging.CommonsLogFilter
druid.filters.wall=com.alibaba.druid.wall.WallFilter
druid.filters.config=com.alibaba.druid.filter.config.ConfigFilter
druid.filters.haRandomValidator=com.alibaba.druid.pool.ha.selector.RandomDataSourceValidateFilter

除 StatFilter 作为默认过滤器外,其他都为关闭状态。配置过滤器的方法如下:

# 设置过滤器别名,多个使用英文逗号隔开,默认值:default
# 生产环境不建议使用其他过滤器。
spring.datasource.druid.filters=stat

StatViewServlet

Druid 管控台配置,考虑到安全问题默认为关闭,如需开启,建议设置密码或白名单以保障安全。配置开启后,才能打开管控台页面查看监控信息。

浏览器访问:http://127.0.0.1:8080/druid/index.html

## DruidStatViewServletConfiguration
# 是否开启管控台页面访问,默认值:false
spring.datasource.druid.stat-view-servlet.enabled=true
# URL 映射路径,默认值:/druid/*
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
# 是否允许重置,默认允许
# 注意:设置为 false 后,管控台的重置按钮并不会消失,但数据不会重置
spring.datasource.druid.stat-view-servlet.reset-enable=false
# 管控台登录用户名,默认未设置
spring.datasource.druid.stat-view-servlet.login-username=admin
# 管控台登录密码,默认未设置
spring.datasource.druid.stat-view-servlet.login-password=admin123
# 管控台访问白名单,默认值:127.0.0.1
spring.datasource.druid.stat-view-servlet.allow=127.0.0.1,10.177.37.15
# 管控台访问黑名单,默认未设置
spring.datasource.druid.stat-view-servlet.deny=10.177.37.14

WebStatFilter

开启 Web 请求监控,默认为关闭。配置开启后,可以在 Druid 管控台查看 Web 请求的监控信息。

## DruidWebStatFilterConfiguration
# 是否开启 Web 请求的统计,默认值:false
spring.datasource.druid.web-stat-filter.enabled=true
# 以下参数保持默认配置即可,生产环境不建议启用
# spring.datasource.druid.web-stat-filter.url-pattern=
# spring.datasource.druid.web-stat-filter.exclusions=
# spring.datasource.druid.web-stat-filter.session-stat-enable=
# spring.datasource.druid.web-stat-filter.session-stat-max-count=
# spring.datasource.druid.web-stat-filter.principal-session-name=
# spring.datasource.druid.web-stat-filter.principal-cookie-name=
# spring.datasource.druid.web-stat-filter.profile-enable=

StatFilter

用于统计监控信息,默认开启。

## StatFilter
# 是否开启统计,默认值:true
spring.datasource.druid.filter.stat.enabled=true
# 启动连接堆跟踪,默认值:false
spring.datasource.druid.filter.stat.connection-stack-trace-enable=false
# 是否在日志中打印慢SQL,默认值:false
spring.datasource.druid.filter.stat.log-slow-sql=true
# 设置慢SQL的执行时长,默认值:3000毫秒
spring.datasource.druid.filter.stat.slow-sql-millis=3000
# 设置慢SQL的日志级别,默认值:ERROR
spring.datasource.druid.filter.stat.slow-sql-log-level=ERROR
# 是否合并SQL,默认值:false
spring.datasource.druid.filter.stat.merge-sql=false

WallFilter

这是一个特殊的过滤器,用于监控 SQL 安全,避免 SQL 注入,默认为关闭。在 Spring 中配置启用 WallFilter 时,需要先注入 StatFilter 开启监控、WallFilter
配置各种信息、WallConfig 配置拦截 SQL 的规则。

WallConfig 配置参数较多,通常情况下保持默认配置即可。WallConfig 配置详情文档:https://www.cnblogs.com/soundcode/p/6483899.html

## WallFilter
# 是否开启 SQL 监控,默认值:false
spring.datasource.druid.filter.wall.enabled=true

LogFilter

Druid 内置提供了四种 LogFilter(Log4jFilter、Log4j2Filter、CommonsLogFilter、Slf4jLogFilter),用于输出 JDBC 执行的日志。这些
Filter 都是 Filter-Chain 扩展机制中的
Filter,所以配置方式可以参考这里:Druid 中使用 log4j2 进行日志输出

尽管 Druid 支持日志过滤器,但在生产环境几乎是不可能开启日志配置的。所以,这里只作了解,实际应用比较复杂。

# 是否开启日志,默认值:false
spring.datasource.druid.filter.slf4j.enabled=false
spring.datasource.druid.filter.log4j.enabled=false
spring.datasource.druid.filter.log4j2.enabled=false
spring.datasource.druid.filter.commons-log.enabled=false

EncodingConvertFilter

由于历史原因,一些数据库保存数据的时候使用了错误编码,需要做编码转换。通过 connectionProperties 来配置客户端编码和服务器端编码。

# 是否开启字符编码转换,默认值:false
spring.datasource.druid.filter.encoding.enabled=true
# 指定客户端和服务端的字符编码
spring.datasource.druid.connection-properties=clientEncoding=UTF-8;serverEncoding=ISO-8859-1

ConfigFilter

ConfigFilter的作用包括:

  1. 从配置文件中读取配置
  2. 从远程http文件中读取配置
  3. 为数据库密码提供加密功能

详情查看官方文档:使用 ConfigFilter

# 是否开启配置,默认值:false
spring.datasource.druid.filter.config.enabled=true
# 密码加密处理后,需要开启解密
spring.datasource.druid.connection-properties=config.decrypt=true

多数据源配置

Spring Boot 2.X 版本不再支持配置继承,多数据源的话每个数据源的所有配置都需要单独配置,否则配置不会生效。

1)添加多数据配置:

## Spring DruidDataSource Configuration
# spring.datasource.druid.one.name=DataSource-1
# spring.datasource.druid.one.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.one.url=jdbc:mysql://localhost:3306/dbname1?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&autoReconnectForPools=true&noAccessToProcedureBodies=true&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
spring.datasource.druid.one.username=root
spring.datasource.druid.one.password=123456
spring.datasource.druid.one.initial-size=10
spring.datasource.druid.one.min-idle=10
spring.datasource.druid.one.max-active=100
spring.datasource.druid.one.max-wait=6000
spring.datasource.druid.one.test-while-idle=true
spring.datasource.druid.one.test-on-borrow=false
spring.datasource.druid.one.test-on-return=false
spring.datasource.druid.one.validation-query=select 1
spring.datasource.druid.one.time-between-eviction-runs-millis=30000
spring.datasource.druid.one.min-evictable-idle-time-millis=600000
spring.datasource.druid.one.max-evictable-idle-time-millis=900000
spring.datasource.druid.one.keep-alive=true


## Spring DruidDataSource Configuration
# spring.datasource.druid.two.name=DataSource-1
# spring.datasource.druid.two.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.two.url=jdbc:mysql://localhost:3306/dbname2?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&autoReconnectForPools=true&noAccessToProcedureBodies=true&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
spring.datasource.druid.two.username=root
spring.datasource.druid.two.password=123456
spring.datasource.druid.two.initial-size=10
spring.datasource.druid.two.min-idle=10
spring.datasource.druid.two.max-active=100
spring.datasource.druid.two.max-wait=6000
spring.datasource.druid.two.test-while-idle=true
spring.datasource.druid.two.test-on-borrow=false
spring.datasource.druid.two.test-on-return=false
spring.datasource.druid.two.validation-query=select 1
spring.datasource.druid.two.time-between-eviction-runs-millis=30000
spring.datasource.druid.two.min-evictable-idle-time-millis=600000
spring.datasource.druid.two.max-evictable-idle-time-millis=900000
spring.datasource.druid.two.keep-alive=true

2)创建多数据源:

@Primary
@Bean
@ConfigurationProperties("spring.datasource.druid.one")
public DruidDataSource dataSourceOne() 
	return DruidDataSourceBuilder.create().build();


@Bean
@ConfigurationProperties("spring.datasource.druid.two")
public DruidDataSource dataSourceTwo() 
	return DruidDataSourceBuilder.create().build();

3)使用多数据源:

@Autowired
private DruidDataSource dataSourceOne;

@Autowired
@Qualifier("dataSourceTwo")
private DruidDataSource dataSourceTwo;

配置多数据源的注意事项:

  • 配置多数据源时,最好通过 @Primary 指定默认数据源。
  • Druid 创建数据源对象时,建议使用 DruidDataSource 代替 DataSource。
  • Druid 创建数据源对象时,注意创建 Bean 的方法名,最好通过 @Bean(“dataSourceOne”) 来指定数据源对象的名称。
  • 多数据源通常结合 ORM 框架一起使用。

Spring Boot 2.x基础教程:使用国产数据库连接池Druid

上一节,我们介绍了Spring Boot在JDBC模块中自动化配置使用的默认数据源HikariCP。接下来这一节,我们将介绍另外一个被广泛应用的开源数据源:Druid。

Druid是由阿里巴巴数据库事业部出品的开源项目。它除了是一个高性能数据库连接池之外,更是一个自带监控的数据库连接池。虽然HikariCP已经很优秀,但是对于国内用户来说,可能对于Druid更为熟悉。所以,对于如何在Spring Boot中使用Druid是后端开发人员必须要掌握的基本技能。

配置Druid数据源

这一节的实践我们将基于《Spring Boot 2.x基础教程:使用JdbcTemplate访问MySQL数据库》一文的代码基础上进行。所以,读者可以从文末的代码仓库中,检出chapter3-1目录来进行下面的实践学习。

下面我们就来开始对Spring Boot项目配置Druid数据源:

第一步:在pom.xml中引入druid官方提供的Spring Boot Starter封装。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.21</version>
</dependency>

第二步:在application.properties中配置数据库连接信息。

Druid的配置都以spring.datasource.druid作为前缀,所以根据之前的配置,稍作修改即可:

spring.datasource.druid.url=jdbc:mysql://localhost:3306/test
spring.datasource.druid.username=root
spring.datasource.druid.password=
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver

第三步:配置Druid的连接池。

与Hikari一样,要用好一个数据源,就要对其连接池做好相应的配置,比如下面这样:

spring.datasource.druid.initialSize=10
spring.datasource.druid.maxActive=20
spring.datasource.druid.maxWait=60000
spring.datasource.druid.minIdle=1
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=true
spring.datasource.druid.testOnReturn=false
spring.datasource.druid.poolPreparedStatements=true
spring.datasource.druid.maxOpenPreparedStatements=20
spring.datasource.druid.validationQuery=SELECT 1
spring.datasource.druid.validation-query-timeout=500
spring.datasource.druid.filters=stat

关于Druid中各连接池配置的说明可查阅下面的表格:

配置 缺省值 说明
name 配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。如果没有配置,将会生成一个名字,格式是:”DataSource-“ + System.identityHashCode(this). 另外配置此属性至少在1.0.5版本中是不起作用的,强行设置name会出错。详情-点此处
url 连接数据库的url,不同数据库不一样。例如: mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
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,是组合关系,并非替换关系

到这一步,就已经完成了将Spring Boot的默认数据源HikariCP切换到Druid的所有操作。

配置Druid监控

既然用了Druid,那么对于Druid的监控功能怎么能不用一下呢?下面就来再进一步做一些配置,来启用Druid的监控。

第一步:在pom.xml中引入spring-boot-starter-actuator模块

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

第二步:在application.properties中添加Druid的监控配置。

spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.stat-view-servlet.reset-enable=true
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin

上面的配置主要用于开启stat监控统计的界面以及监控内容的相关配置,具体释意如下:

  • spring.datasource.druid.stat-view-servlet.url-pattern:访问地址规则
  • spring.datasource.druid.stat-view-servlet.reset-enable:是否允许清空统计数据
  • spring.datasource.druid.stat-view-servlet.login-username:监控页面的登录账户
  • spring.datasource.druid.stat-view-servlet.login-password:监控页面的登录密码

第三步:针对之前实现的UserService内容,我们创建一个Controller来通过接口去调用数据访问操作:

@Data
@AllArgsConstructor
@RestController
public class UserController {

    private UserService userService;

    @PostMapping("/user")
    public int create(@RequestBody User user) {
        return userService.create(user.getName(), user.getAge());
    }

    @GetMapping("/user/{name}")
    public List<User> getByName(@PathVariable String name) {
        return userService.getByName(name);
    }

    @DeleteMapping("/user/{name}")
    public int deleteByName(@PathVariable String name) {
        return userService.deleteByName(name);
    }

    @GetMapping("/user/count")
    public int getAllUsers() {
        return userService.getAllUsers();
    }

    @DeleteMapping("/user/all")
    public int deleteAllUsers() {
        return userService.deleteAllUsers();
    }

}

第四步:完成上面所有配置之后,启动应用,访问Druid的监控页面http://localhost:8080/druid/,可以看到如下登录页面:

img

输入上面spring.datasource.druid.stat-view-servlet.login-usernamespring.datasource.druid.stat-view-servlet.login-password配置的登录账户与密码,就能看到如下监控页面:

img

进入到这边时候,就可以看到对于应用端而言的各种监控数据了。这里讲解几个最为常用的监控页面:

数据源:这里可以看到之前我们配置的数据库连接池信息以及当前使用情况的各种指标。

img

SQL监控:该数据源中执行的SQL语句极其统计数据。在这个页面上,我们可以很方便的看到当前这个Spring Boot都执行过哪些SQL,这些SQL的执行频率和执行效率也都可以清晰的看到。如果你这里没看到什么数据?别忘了我们之前创建了一个Controller,用这些接口可以触发UserService对数据库的操作。所以,这里我们可以通过调用接口的方式去触发一些操作,这样SQL监控页面就会产生一些数据:

img

图中监控项上,执行时间、读取行数、更新行数都通过区间分布的方式表示,将耗时分布成8个区间:

  • 0 - 1 耗时0到1毫秒的次数
  • 1 - 10 耗时1到10毫秒的次数
  • 10 - 100 耗时10到100毫秒的次数
  • 100 - 1,000 耗时100到1000毫秒的次数
  • 1,000 - 10,000 耗时1到10秒的次数
  • 10,000 - 100,000 耗时10到100秒的次数
  • 100,000 - 1,000,000 耗时100到1000秒的次数
  • 1,000,000 - 耗时1000秒以上的次数

记录耗时区间的发生次数,通过区分分布,可以很方便看出SQL运行的极好、普通和极差的分布。 耗时区分分布提供了“执行+RS时分布”,是将执行时间+ResultSet持有时间合并监控,这个能方便诊断返回行数过多的查询。

SQL防火墙:该页面记录了与SQL监控不同维度的监控数据,更多用于对表访问维度、SQL防御维度的统计。

img

该功能数据记录的统计需要在spring.datasource.druid.filters中增加wall属性才会进行记录统计,比如这样:

spring.datasource.druid.filters=stat,wall

注意:这里的所有监控信息是对这个应用实例的数据源而言的,而并不是数据库全局层面的,可以视为应用层的监控,不可能作为中间件层的监控。

代码示例

本文的相关例子可以查看下面仓库中的chapter3-3目录:

如果您觉得本文不错,欢迎Star支持,您的关注是我坚持的动力!

欢迎关注我的公众号:程序猿DD,获得独家整理的学习资源和日常干货推送。
如果您对我的专题内容感兴趣,也可以关注我的博客:didispace.com

以上是关于Spring Boot 使用 Druid 连接池详解的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2.x基础教程:使用国产数据库连接池Druid

spring boot整合Druid连接池

Spring Boot:集成Druid数据源

spring boot整合Druid连接池

Spring Boot:Spring Boot整合Druid

spring boot 集成Druid