mysql之druid连接池参数配置详解
·
文章目录
druid常见问题在GitHub地址
https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
配置参数
单独使用druid的依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.11</version>
</dependency>
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
# druid配置
# 连接池初始化时创建的连接数,建议是和CPU的核数、minIdle一致
initialSize: 8
# 连接池中最大连接数,不宜过大,否则CPU线程切换开销也会导致性能下降,需要结合RT(响应时间)判断,
# 并且跟代码中是否添加了事务有关,如果代码中没有事务,执行完sql就会归还连接,最大连接数设置成CPU的2倍就够用,如果代码中有事务,
#需要整个代码逻辑执行完才会归还连接则需要设置大点,此时如果单条响应时间短则可以设置大点,如响应时间为10毫秒,则可以设置成100,个人总结规律,建议
maxActive: 50
# 连接池中最小空闲连接数,建议是和CPU的核数、initialSize一致
minIdle: 8
# 连接池中最大空闲连接数,已被废弃,以maxActive为准
maxIdle: 10
# 获取连接时的最大等待时间(毫秒),如达到最大连接,且所有连接被使用,获取时等待的超时时间
maxWait: 60000
# 间隔多久检测一次空闲连接是否有效(毫秒)
timeBetweenEvictionRunsMillis: 60000
# 连接池中连接最小空闲时间(毫秒),连接池中的连接被销毁的条件,连接数 > minIdle && 空闲时间 > minEvictableIdleTimeMillis
minEvictableIdleTimeMillis: 300000
# 连接池中连接最大空闲时间(毫秒),连接池中的连接被销毁的条件,空闲时间 > maxEvictableIdleTimeMillis,不管连接池中的连接数是否小于最小连接数
maxEvictableIdleTimeMillis: 25200000
# 用于检测连接是否有效的SQL语句
validationQuery: SELECT 1
# 是否开启空闲连接的检测,作用类似testOnBorrow
testWhileIdle: true
# 是否开启连接的检测功能(借出时检测),在获取连接时检测连接是否有效,开启会获取连接时先执行下validationQuery配置的语句看连接是否有效,所以会影响性能,
testOnBorrow: false
# 是否开启连接的检测功能(归还时检测),在归还连接时检测连接是否有效,此参数必须和testOnBorrow同时设置为true当服务端关闭,客户端才不会报错
testOnReturn: false
# 是否缓存PreparedStatement对象
poolPreparedStatements: true
# 缓存PreparedStatement对象的最大数量
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计用的filter,允许监控统计
filters: stat
# 配置扩展属性,用于监控统计分析SQL性能等
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
注意:避免数据库单方面关闭连接,可查询mysql:show variables like ‘%timeout%’;,单位为秒
关注interactive_timeout和 wait_timeout,默认为8个小时,解决办法
minEvictableIdleTimeMillis < maxEvictableIdleTimeMillis && maxEvictableIdleTimeMillis + timeBetweenEvictionRunsMillis < 服务端的wait_timeout
- testWhileIdle:配置此参数猜测是只是将超出空闲时间的连接销毁,销毁后如果连接池中小于最小连接数甚至没有连接后不会立马创建连接,而是使用时创建连接,因为通过
SHOW PROCESSLIST;查看当mysql服务端关闭所有客户端连接后,且过了timeBetweenEvictionRunsMillis的时间服务端还是没有看到新的连接,只有再次查询使用时才创建了一个连接,也不是创建了minIdle个连接
配置类,配置了此类才会用配置的参数,否则是druid默认的参数值
package druid.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class DataSourceConfiguration {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource dataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
return druidDataSource;
}
}
druid接收到请求的处理流程
- 请求到达:
- 当有新的数据库请求到达时,Druid连接池会首先检查当前活跃连接数是否已经达到最大连接数(
maxActive)。
- 当有新的数据库请求到达时,Druid连接池会首先检查当前活跃连接数是否已经达到最大连接数(
- 判断等待或拒绝:
- 如果当前活跃连接数未达到最大连接数,则Druid连接池会尝试创建新的连接或分配空闲连接给请求。
- 如果当前活跃连接数已经达到最大连接数,则Druid连接池会将请求放入等待队列中。
等待队列的容量并不是固定的,可以理解成一个list集合,而是会根据实际情况进行动态调整。这意味着队列的长度可以随着请求数量的增加而增加,但也会受到系统资源和配置参数的限制。 - 在等待队列中,请求会等待空闲连接被释放或新的连接被创建。如果在
maxWait时间内没有获取到连接,则Druid连接池会抛出超时异常,表示请求被拒绝。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)