druid数据库连接池配置项说明

本文详细介绍了druid数据库连接池在SpringBoot中的应用,包括如何集成、配置参数如initialSize、maxWait、validationQuery等,并讨论了这些配置的重要性以及最佳实践。特别强调了testWhileIdle、maxWait的使用注意事项。
摘要由CSDN通过智能技术生成

目录

一、druid简介

二、引入druid数据库连接池

三、druid数据库连接池配置项说明

1. initialSize

2.maxWait

3.validationQuery

4.testWhileIdle,testOnBorrow,testOnReturn

5.timeBetweenEvictionRunsMillis

6.minEvictableIdleTimeMillis

7.validationQueryTimeout


一、druid简介

druid 是一个由阿里巴巴开发的 JDBC 连接池,广泛用于 Java 应用中。druid 特别注重监控,提供了强大的监控和扩展功能,包括详细的 SQL 统计、数据库连接池状态监控等。

二、引入druid数据库连接池

使用springboot集成druid数据库连接池。

引入依赖:

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

配置文件样例:

spring:
  # 数据库连接配置
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/db1
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      initial-size: 5
      min-idle: 5
      max-active: 20
      max-wait: 60000
      test-while-idle: true
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      validation-query: SELECT 1
      test-on-borrow: false
      test-on-return: false

三、druid数据库连接池配置项说明

下面对每个配置项的具体含义进行说明。

1. initialSize

初始化连接数:连接池启动时创建的初始化连接数量,默认值0 初始连接数,这里的初始指的是第一次getConnection的时候,而不是应用启动的时候。 这就是为什么第一次进行数据库操作的时候,响应会比较慢的原因,创建数据库连接是很耗时的,所以初始化连接并不是越多越好,配置过大容易导致服务发布首次请求出现大量超时。

案例一:

initialSize=0(不配置默认为0)

这种配置会导致服务启动时,大量请求进来没有足够的连接使用而去获取链接,导致出现很多获取连接超时异常。

案例二:

initialSize=100

maxActive=100

这种配置会导致服务启动后首次请求响应会比较慢,可能会导致超时。

2.maxWait

参数表示从连接池获取连接的超时等待时间,单位毫秒,需要注意这个参数只管理获取连接的超时。获取连接等待的直接原因是池子里没有可用连接,具体包括:连接池未初始化,连接长久未使用已被释放,连接使用中需要新建连接,或连接池已耗尽需等待连接用完后归还。这里有一个很关键的点是 maxWait 未配置或者配置为 0 时,表示不设等待超时时间。

案例一

maxWait=0

正常流量下业务没有发现任何问题,但突发大流量涌入时,造成连接池耗尽,所有新增的DB请求处于等待获取连接的状态中。由于 maxWait=0 表示无限等待,在请求速度大于处理速度的情况下等待队列会越排越长,最终业务上的表现就是业务接口大量超时甚至可能打满容器线程造成服务不可用,流量越大造成实际吞吐量反而越低。

推荐配置: 内网(网络状况好) 1200ms。网络状况不是特别好的情况下推荐大于等于 1200ms,因为tcp 建连重试一般是 1 秒。

3.validationQuery

当Druid遇到testWhileIdle,testOnBorrow,testOnReturn时,就会验证连接的有效性,验证规则如下:
如果有相关数据库的ValidConnectionChecker,则使用ValidConnectionChecker验证(Druid提供常用数据库的ValidConnectionChecker,包括MSSQLValidConnectionChecker,MySqlValidConnectionChecker,OracleValidConnectionChecker,PGValidConnectionChecker)。如果没有ValidConnectionChecker,则直接使用validationQuery验证。

Druid用来测试连接是否可用的SQL语句,默认值每种数据库都不相同:
Mysql:SELECT 1;
SQLSERVER:SELECT 1;
ORACLE:SELECT 'x' FROM DUAL;
PostGresql:SELECT 'x';

4.testWhileIdle,testOnBorrow,testOnReturn

testWhileIdle,这一项官方建议设置为true,如果testOnBorrow没有被置为true,则会进行testWhileIdle的检查,检查时会判断当前连接对象距离上次被使用的时间是否超过规定检查的时间,若超过,则进行检查一次,这个检查时间通过timeBetweenEvictionRunsMillis来控制,默认60s。

testOnBorrow,官方不建议设置testOnBorrowtrue,默认为false,如果开启了testOnBorrow,则每次请求都会去测试连接是否可用,会极大影响服务性能。

testOnReturn,这个跟testOnBorrow一样,官方默认不开启,也不建议开启,影响性能,理由参考对testOnBorrow的解释。

5.timeBetweenEvictionRunsMillis

作为验证连接是否有效的时间周期,如果testOnBorrow==false并且testWhileIdle==true,则在应用获取连接的时候会判断连接的空闲时间是否大于timeBetweenEvictionRunsMillis,如果大于则会验证该连接是否有效。

6.minEvictableIdleTimeMillis

连接池中连接可空闲的时间。

timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis一起使用,每timeBetweenEvictionRunsMillis毫秒检查一次连接池中空闲的连接,

把空闲时间超过minEvictableIdleTimeMillis毫秒的连接断开,直到连接池中的连接数到minIdle为止主要把这两个参数加上就好。

7.validationQueryTimeout

validationQueryTimeout仅控制validationQuery的超时。

  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值