spring-boot下Hikari、Druid的使用
文章目录
- 一.引言
- 二.Hikari
- 三.Druid
- 四.连接池参数
一.引言
数据库连接池负责分配、管理、释放数据库连接,它允许应用程序重复使用现有的数据连接,而不是重新创建一个。释放超过最大空间时间的数据库连接来避免因为没有释放数据库连接导致数据库连接泄漏。本文主要介绍Hikari和Druid两种数据库连接池的使用。
Hikari速度极快;但是Druid功能更加全面,支持sql级监控,扩展、SQL防注入,而且有更多、更久的生产实践、更可靠。
二.Hikari
-
maven依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>
-
配置方式
spring: datasource: type: com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/blog-data?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8 username: root password: 123456 hikari: minimum-idle: 5
-
HikariDataSource注入过程
-
spring-boot-autoconfigure依赖下的META-INFO/spring-factories
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,
-
DataSourceAutoConfiguration
@Configuration(proxyBeanMethods = false) @Conditional(PooledDataSourceCondition.class) @ConditionalOnMissingBean({ DataSource.class, XADataSource.class }) // 导入Hikari @Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class, DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.Generic.class, DataSourceJmxConfiguration.class }) protected static class PooledDataSourceConfiguration { }
-
DataSourceConfiguration.Hikari
@Configuration(proxyBeanMethods = false) //有class文件的时候执行 @ConditionalOnClass(HikariDataSource.class) //没有实例的时候执行 @ConditionalOnMissingBean(DataSource.class) //有配置的时候执行 @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource", matchIfMissing = true) static class Hikari { //注入dataSource bean @Bean //设置HikariDataSource实例的属性 @ConfigurationProperties(prefix = "spring.datasource.hikari") HikariDataSource dataSource(DataSourceProperties properties) { HikariDataSource dataSource = createDataSource(properties, HikariDataSource.class); if (StringUtils.hasText(properties.getName())) { dataSource.setPoolName(properties.getName()); } return dataSource; } }
-
三.Druid
-
maven依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency>
-
配置方式
spring: datasource: type: com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/blog-data?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8 username: root password: 123456 druid: minimum-idle: 5
-
DruidDataSource注入方式
-
druid-spring-boot-starter下的spring.factory
com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
-
DruidDataSourceAutoConfigure
//调用DruidDataSource的init方法 @Bean( initMethod = "init" ) @ConditionalOnMissingBean public DataSource dataSource() { LOGGER.info("Init DruidDataSource"); return new DruidDataSourceWrapper(); }
-
DruidDataSourceWrapper
@ConfigurationProperties("spring.datasource.druid") class DruidDataSourceWrapper extends DruidDataSource implements InitializingBean { @Autowired private DataSourceProperties basicProperties; DruidDataSourceWrapper() { } public void afterPropertiesSet() throws Exception { if (super.getUsername() == null) { super.setUsername(this.basicProperties.determineUsername()); } if (super.getPassword() == null) { super.setPassword(this.basicProperties.determinePassword()); } if (super.getUrl() == null) { super.setUrl(this.basicProperties.determineUrl()); } if (super.getDriverClassName() == null) { super.setDriverClassName(this.basicProperties.getDriverClassName()); } } }
-
DruidDataSource.init()进行参数校验
-
四.连接池参数
配置 | 说明 |
---|---|
initialSize | 初始连接池大小 |
minIdle | 最小连接数 |
maxActive | 最大连接数 |
maxWait | 获取连接最大等待时间 |
minEvictableIdleTimeMillis | 连接最小生存时间 |
maxEvictableIdleTimeMillis | 连接最大生存时间 |
timeBetweenEvictionRunsMillis | 间隔多久进行一次连接检测,检测需要关闭的空闲连接 |
testWhileIdle | 从连接池获取连接时,连接空闲时间大于timeBetweenEvictionRunsMillis时检测连接有效性 |
testOnBorrow | 获取连接时检测连接有效性 |
testOnReturn | 归还连接时检测连接有效性,每次获取和归还连接时都检测太过频繁,建议使用testWhileIdle+ timeBetweenEvictionMills |
keepAlive | 是否定期探活 |
keepAliveBetweenTimeMillis | 探活间隔 |
phyMaxUseCount | 最大使用次数 |
validationQuery | 探活、验证链接有效性的查询 |
filters | 监控统计拦截的filter |