点击上方“芋道源码”,选择“设为星标”
做积极的人,而不是积极废人!
源码精品专栏
原创 | Java 2020 超神之路,很肝~
中文详细注释的开源项目
RPC 框架 Dubbo 源码解析
网络应用框架 Netty 源码解析
消息中间件 RocketMQ 源码解析
数据库中间件 Sharding-JDBC 和 MyCAT 源码解析
作业调度中间件 Elastic-Job 源码解析
分布式事务中间件 TCC-Transaction 源码解析
Eureka 和 Hystrix 源码解析
Java 并发源码
摘要: 原创出处 http://www.iocoder.cn/Spring-Boot/datasource-pool/ 「芋道源码」欢迎转载,保留摘要,谢谢!
- 1. 概述
- 2. HikariCP 单数据源
- 3. HikariCP 多数据源
- 4. Druid 单数据源
- 5. Druid 多数据源
- 666. 彩蛋
本文在提供完整代码示例,可见 https://github.com/YunaiV/SpringBoot-Labs 的 lab-19 目录。
原创不易,给点个 Star 嘿,一起冲鸭!
1. 概述
在我们的项目中,数据库连接池基本是必不可少的组件。在目前数据库连接池的选型中,主要是
- Druid ,为监控而生的数据库连接池。
- HikariCP ,号称性能最好的数据库连接池。
至于怎么选择,两者都非常优秀,不用过多纠结。
- Spring Boot 2.X 版本,默认采用 HikariCP 。
- 阿里大规模采用 Druid 。
当然,如下有一些资料,胖友可以阅读参考:
- 《Druid 连接池介绍》
- 《为什么 HikariCP 被号称为性能最好的 Java 数据库连接池,如何配置使用》
- 《alibaba/druid pool analysis》 ,一个小小的“撕逼”。
下面,我们来进行 HikariCP 和 Druid 的入门,会配置单数据源和多数据源情况下的连接池。
2. HikariCP 单数据源
示例代码对应仓库:lab-19-datasource-pool-hikaricp-single 。
在本小节,我们会使用配置一个数据源的 HikariCP 连接池。
艿艿:推荐入门后,可以看看 HikariCP 的文档:https://github.com/brettwooldridge/HikariCP/wiki 。
2.1 引入依赖
在 pom.xml
文件中,引入相关依赖。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.1.3.RELEASEversion>
<relativePath/>
parent>
<modelVersion>4.0.0modelVersion>
<artifactId>lab-19-datasource-pool-hikaricp-singleartifactId>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-jdbcartifactId>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.48version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
project>
- 无需主动引入 HikariCP 的依赖。因为在 Spring Boot 2.X 中,
spring-boot-starter-jdbc
默认引入com.zaxxer.HikariCP
依赖。
2.2 应用配置文件
在 application.yml
中,添加 HikariCP 配置,如下:
spring:
# datasource 数据源配置内容,对应 DataSourceProperties 配置属性类
datasource:
url: jdbc:mysql://127.0.0.1:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8
driver-class-name: com.mysql.jdbc.Driver
username: root # 数据库账号
password: # 数据库密码
# HikariCP 自定义配置,对应 HikariConfig 配置属性类
hikari:
minimum-idle: 10 # 池中维护的最小空闲连接数,默认为 10 个。
maximum-pool-size: 10 # 池中最大连接数,包括闲置和使用中的连接,默认为 10 个。
- 在
spring.datasource
配置项下,我们可以添加数据源的通用配置。 - 在
spring.datasource.hikari
配置项下,我们可以添加 HikariCP 连接池的自定义配置。然后DataSourceConfiguration.Hikari
会自动化配置 HikariCP 连接池。
HikariCP 更多配置项,可以看看如下表格:s
FROM 《HikariCP 连接池及其在 Spring Boot 中的配置》
配置项 | 描述 | 构造器默认值 | 默认配置validate之后的值 | validate重置 |
---|---|---|---|---|
autoCommit | 自动提交从池中返回的连接 | true | true | - |
connectionTimeout | 等待来自池的连接的最大毫秒数 | SECONDS.toMillis(30) = 30000 | 30000 | 如果小于250毫秒,则被重置回30秒 |
idleTimeout | 连接允许在池中闲置的最长时间 | MINUTES.toMillis(10) = 600000 | 600000 | 如果idleTimeout+1秒>maxLifetime 且 maxLifetime>0,则会被重置为0(代表永远不会退出);如果idleTimeout!=0且小于10秒,则会被重置为10秒 |
maxLifetime | 池中连接最长生命周期 | MINUTES.toMillis(30) = 1800000 | 1800000 | 如果不等于0且小于30秒则会被重置回30分钟 |
connectionTestQuery | 如果您的驱动程序支持JDBC4,我们强烈建议您不要设置此属性 | null | null | - |
minimumIdle | 池中维护的最小空闲连接数 | -1 | 10 | minIdle<0或者minIdle>maxPoolSize,则被重置为maxPoolSize |
maximumPoolSize | 池中最大连接数,包括闲置和使用中的连接 | -1 | 10 | 如果maxPoolSize小于1,则会被重置。当minIdle<=0被重置为DEFAULT_POOL_SIZE则为10;如果minIdle>0则重置为minIdle的值 |
metricRegistry | 该属性允许您指定一个 Codahale / Dropwizard MetricRegistry 的实例,供池使用以记录各种指标 |
null | null | - |
healthCheckRegistry | 该属性允许您指定池使用的Codahale / Dropwizard HealthCheckRegistry的实例来报告当前健康信息 | null | null | - |
poolName | 连接池的用户定义名称,主要出现在日志记录和JMX管理控制台中以识别池和池配置 | null | HikariPool-1 | - |
initializationFailTimeout | 如果池无法成功初始化连接,则此属性控制池是否将 fail fast |
1 | 1 | - |
isolateInternalQueries | 是否在其自己的事务中隔离内部池查询,例如连接活动测试 | false | false | - |
allowPoolSuspension | 控制池是否可以通过JMX暂停和恢复 | false | false | - |
readOnly | 从池中获取的连接是否默认处于只读模式 | false | false | - |
registerMbeans | 是否注册JMX管理Bean(MBeans ) |
false | false | - |
catalog | 为支持 catalog 概念的数据库设置默认 catalog |
driver default | null | - |
connectionInitSql | 该属性设置一个SQL语句,在将每个新连接创建后,将其添加到池中之前执行该语句。 | null | null | - |
driverClassName | HikariCP将尝试通过仅基于jdbcUrl的DriverManager解析驱动程序,但对于一些较旧的驱动程序,还必须指定driverClassName | null | n |