SpringBoot数据库连接池Hikari配置

博客介绍了数据库连接池可避免复杂系统频繁建立、关闭连接带来的性能问题。Spring Boot项目通过启动器使用JPA或MyBatis时,默认使用Hikari数据库连接池。还提及可在配置文件设置其常用配置项,上线时可按需调整以提升数据库操作性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目中,一般情况下访问数据库,会创建一个连接,用完后就关闭它,对于简单的系统这样不会带来什么明显的性能上的开销。但是对于一个复杂的系统,频繁的建立、关闭连接,会极大的减低系统的性能,因为对于数据库连接的使用可能会成为系统性能的瓶颈。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。

SpringBoot默认使用Hikari

SpringBoot项目如果我们通过启动器starter使用JPA或者Mybatis,是默认会使用Hikari数据库连接池的,官方的介绍如下:

Connection to a Production Database

Production database connections can also be auto-configured by using a pooling DataSource. Spring Boot uses the following algorithm for choosing a specific implementation:

  1. We prefer HikariCP for its performance and concurrency. If HikariCP is available, we always choose it.

  2. Otherwise, if the Tomcat pooling DataSource is available, we use it.

  3. Otherwise, if Commons DBCP2 is available, we use it.

  4. If none of HikariCP, Tomcat, and DBCP2 are available and if Oracle UCP is available, we use it.

If you use the spring-boot-starter-jdbc or spring-boot-starter-data-jpa “starters”, you automatically get a dependency to HikariCP.

spring-boot-starter-jdbc

Starter for using JDBC with the HikariCP connection pool

 spring-boot-starter-jdbc依赖会自动使用HikariCP,在SpringBoot项目中如果我们通过mybatis-spring-boot-starter启动器使用mybatis连接数据库,可以看到spring-boot-starter-jdbc是编译依赖项。

 如果我们通过spring-boot-starter-data-jpa启动器starter使用JPA连接数据库,可以看到spring-boot-starter-jdbc也是编译依赖项。所以SpringBoot项目我们通过spring-boot-starter-data-jpa使用JPA或者mybatis-spring-boot-starter使用Mybatis都是会默认自动使用Hikari数据库连接池。

 Hikari常用配置

在SpringBoot项目中我们可以不配置Hikari的配置项,项目会使用默认的值启用HikariCP数据库连接池,我们也可以通过application.yml/application.properties文件设置HikariCP的配置项,常用的配置项如下:

# Hikari pool https://github.com/brettwooldridge/HikariCP
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
# 连接池中允许的最小连接数。缺省值:10
spring.datasource.hikari.minimum-idle=10
# 连接池中允许的最大连接数。缺省值:10
spring.datasource.hikari.maximum-pool-size=100
# 自动提交
spring.datasource.hikari.auto-commit=true
# 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟
spring.datasource.hikari.idle-timeout=30000
# 连接池名字
spring.datasource.hikari.pool-name=FlyduckHikariCP
# 一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒
spring.datasource.hikari.max-lifetime=1800000
# 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒
spring.datasource.hikari.connection-timeout=30000
# 数据库连接测试语句
spring.datasource.hikari.connection-test-query=SELECT 1

SpringBoot官方文档罗列了hikari所有的配置项(如下),同时通过HikariCP的官方github我们可以详细的了解各配置项的默认值以及含义。

spring.datasource.hikari.allow-pool-suspension
spring.datasource.hikari.auto-commit
spring.datasource.hikari.catalog
spring.datasource.hikari.connection-init-sql
spring.datasource.hikari.connection-test-query
spring.datasource.hikari.connection-timeout
spring.datasource.hikari.data-source-class-name
spring.datasource.hikari.data-source-j-n-d-i
spring.datasource.hikari.data-source-properties
spring.datasource.hikari.driver-class-name
spring.datasource.hikari.exception-override-class-name
spring.datasource.hikari.health-check-properties
spring.datasource.hikari.health-check-registry
spring.datasource.hikari.idle-timeout
spring.datasource.hikari.initialization-fail-timeout
spring.datasource.hikari.isolate-internal-queries
spring.datasource.hikari.jdbc-url
spring.datasource.hikari.leak-detection-threshold
spring.datasource.hikari.login-timeout
spring.datasource.hikari.max-lifetime
spring.datasource.hikari.maximum-pool-size
spring.datasource.hikari.metric-registry
spring.datasource.hikari.metrics-tracker-factory
spring.datasource.hikari.minimum-idle
spring.datasource.hikari.password
spring.datasource.hikari.pool-name
spring.datasource.hikari.read-only
spring.datasource.hikari.register-mbeans
spring.datasource.hikari.scheduled-executor
spring.datasource.hikari.schema
spring.datasource.hikari.transaction-isolation
spring.datasource.hikari.username
spring.datasource.hikari.validation-timeout

 

Hikari specific settings bound to an instance of Hikari's HikariDataSource

总结

 SpringBoot项目如果我们通过启动器starter的方式使用JPA或者Mybatis作为数据库持久层框架访问数据库,都会默认自动启用HikariCP数据库连接池。实际项目上线时,可以根据项目的实际情况以及服务器情况设置合适的HikariCP配置项,让HikariCP数据库连接池提高对数据库操作的性能。

 

### 配置 Spring Boot 中双数据源的数据库连接池Spring Boot 应用程序中配置多个数据源可以通过自定义 `@Configuration` 类来实现。对于每个数据源,都需要单独配置其对应的连接池参数。 #### 定义多数据源配置类 通过创建一个新的 Java 配置文件,在其中声明两个不同的 `DataSource` Bean 实例以及相应的 JPAMyBatis 的实体管理器工厂 bean 来区分主次数据源: ```java @Configuration public class MultiDataSourceConfig { @Bean(name = "primaryDataSource") @Primary @ConfigurationProperties(prefix="spring.datasource.primary") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "secondaryDataSource") @ConfigurationProperties(prefix="spring.datasource.secondary") public DataSource secondaryDataSource(){ return DataSourceBuilder.create().build(); } } ``` 这里使用了 `@Primary` 注解标记其中一个为主数据源,默认情况下会优先考虑这个数据源作为应用程序的主要访问入口[^1]。 #### 设置 application.properties 文件中的属性 为了使上述代码正常工作,还需要修改项目的 `application.properties` 文件以包含两组独立的数据源设置项: ```properties # Primary Data Source Configuration spring.datasource.primary.url=jdbc:mysql://localhost:3306/first_db?useSSL=false&serverTimezone=UTC spring.datasource.primary.username=root spring.datasource.primary.password=password spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.primary.type=com.zaxxer.hikari.HikariDataSource # Secondary Data Source Configuration spring.datasource.secondary.url=jdbc:mysql://localhost:3306/second_db?useSSL=false&serverTimezone=UTC spring.datasource.secondary.username=root spring.datasource.secondary.password=password spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.secondary.type=com.alibaba.druid.pool.DruidDataSource ``` 注意这里的 `type` 属性指定了不同类型的连接池用于各个数据源;例如 HikariCP 和 Druid 连接池分别被分配给了主要和次要数据源[^2]。 #### 创建动态切换逻辑的服务层接口 为了让业务逻辑能够灵活地选择要使用的具体哪个数据源,通常会在服务层引入 AOP 切面编程技术或者利用线程局部变量保存当前上下文中应该采用哪一个数据源的信息。下面是一个简单的例子展示如何基于方法级别注解的方式来进行这种转换: ```java @Service public class UserServiceImpl implements UserService { @Autowired private PlatformTransactionManager transactionManager; @Transactional(value = "transactionManager", readOnly = true) @SelectDataSource("primary") public List<User> getAllUsersFromPrimaryDB() { // ... } @Transactional(value = "secondaryTransactionManager", propagation = Propagation.REQUIRED) @SelectDataSource("secondary") public User saveUserToSecondaryDB(User user) { // ... } } ``` 在这个案例里,假设存在名为 `@SelectDataSource` 的自定义注解用来指示目标数据源名称,并且已经实现了相应切面处理器负责实际执行数据源的选择过程[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值