Spring Boot使用MySQL的默认连接池

笔者在近期秋招面试的时候被问到了这个问题,现在简单梳理一下便于后期重新回顾,并加深记忆。


Spring Boot 默认使用的数据库连接池是 HikariCP(开源库地址)。

HikariCP 是目前性能最好的连接池之一,它具有高度的性能、可靠性和可扩展性,并且对于大多数应用场景来说效果非常好。在 Spring Boot 中,只需要在配置文件中进行相应的配置,即可使用 HikariCP 进行数据库连接池管理。

默认情况下,HikariCP连接池的最大连接数被设置为10。这意味着在同一时间点,最多可以有10个连接可供使用。当所有连接都被占用时,后续的连接请求将会被阻塞,直到有一个连接可用为止。

优势

  1. 连接池管理:HikariCP提供了连接池管理的功能,可以通过配置连接池大小和连接超时时间等参数来优化数据库连接性能。
  2. 快速启动:HikariCP在启动时会自动创建连接池,因此可以快速响应应用启动请求。
  3. 连接池监控:HikariCP提供了详细的连接池监控信息,可以通过日志或其他监控工具来查看连接池的使用情况。
  4. 支持事务:HikariCP支持事务管理,可以通过配置事务管理器来实现数据库事务。

Spring Boot项目如何进行具体的数据库连接池配置

在Spring Boot中,可以通过以下方式配置数据库连接和连接池:

  • 配置数据库连接信息:在application.properties中配置数据库连接信息,如下所示:

    spring.datasource.url=jdbc:mysql://localhost:3306/testdb
    spring.datasource.username=root
    spring.datasource.password=password
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver

其中,url是数据库连接的URL,username和password是登录数据库的用户名和密码,driver-class-name是数据库驱动的类名。

  • 配置连接池:在application.properties中配置连接池信息,如下所示:

    spring.datasource.hikari.connection-timeout=5000
    spring.datasource.hikari.idle-timeout=30000
    spring.datasource.hikari.pool-size=100
    spring.datasource.hikari.minimum-idle=10
    spring.datasource.hikari.maximum-pool-size=100
    spring.datasource.hikari.transaction-isolation=TRANSACTION_READ_COMMITTED

其中,connection-timeout是连接超时时间,idle-timeout是空闲连接池的超时时间,pool-size是连接池的大小,minimum-idle是连接池中最小的空闲连接数,maximum-pool-size是连接池中最大的连接数,transaction-isolation是事务隔离级别。

  • 配置连接池类型:在application.properties中配置连接池类型,如下所示:

    spring.datasource.type=com.hikari.HikariDataSource

其中,type属性指定了连接池的类型为HikariDataSource。

编写代码测试连接池的性能

java 复制代码
import org.junit.Test;
import org.junit.runner.RunWith;

import static org.mockito.Mockito.*;

import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class HikariCPPerformanceTest {

    @Mock
    private HikariDataSource dataSource;

    @Test
    public void testPerformance() {
        // 设置连接池大小为100,连接超时时间为5秒
        when(dataSource.getConnection()).thenReturn(mock(Connection.class));
        for (int i = 0; i < 1000; i++) {
            // 模拟并发请求100个连接
            new Thread(() -> {
                try {
                    Connection connection = dataSource.getConnection();
                    // 执行SQL语句
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }).start();
        }
        // 等待所有线程执行完成
        try {
            for (int i = 0; i < 1000; i++) {
                Thread.sleep(100);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 验证连接池是否正常工作
        verify(dataSource, times(1000)).getConnection();
    }
}

上述代码通过Mockito框架来模拟HikariDataSource对象,并模拟了100个并发请求,每个请求执行一次数据库连接操作。通过等待所有线程执行完成并验证连接池是否正常工作来进行性能测试。

为什么不用Druid

  1. 社区支持:HikariCP是一个非常受欢迎的连接池实现,拥有广泛的社区支持和丰富的文档资源。相比之下,Druid的社区支持和文档资源可能没有HikariCP那么丰富。
  2. 性能:根据一些性能测试结果,HikariCP在连接池启动速度、连接池大小和连接超时时间等方面的性能表现都比Druid更好。
  3. 简单易用:HikariCP的配置相对简单,只需要在application.properties中配置一些基本信息即可启用连接池。而Druid的配置相对复杂,需要在web.xml或类似的配置文件中配置多个属性。
  4. Spring Boot的默认选择:Spring Boot默认选择HikariCP作为连接池实现,因此在开发时直接使用Spring Boot提供的配置即可。

扩展阅读

深入浅出HikariCP数据库连接池 - 掘金

相关推荐
间彧5 分钟前
如何结合CI/CD流水线自动选择正确的Docker Compose配置?
后端
间彧6 分钟前
在多环境(开发、测试、生产)下,如何管理不同的Docker Compose配置?
后端
间彧8 分钟前
如何为Docker Compose中的服务配置健康检查,确保服务真正可用?
后端
间彧12 分钟前
Docker Compose和Kubernetes在编排服务时有哪些核心区别?
后端
间彧17 分钟前
如何在实际项目中集成Arthas Tunnel Server实现Kubernetes集群的远程诊断?
后端
Dxy12393102161 小时前
MySQL的SUBSTRING函数详解与应用
数据库·mysql
码力引擎1 小时前
【零基础学MySQL】第十二章:DCL详解
数据库·mysql·1024程序员节
brzhang1 小时前
读懂 MiniMax Agent 的设计逻辑,然后我复刻了一个MiniMax Agent
前端·后端·架构
杨云龙UP1 小时前
【MySQL迁移】MySQL数据库迁移实战(利用mysqldump从Windows 5.7迁至Linux 8.0)
linux·运维·数据库·mysql·mssql
lang201509281 小时前
Spring Boot日志配置完全指南
java·spring boot·单元测试