SpringBoot集成Hikari连接池及其原理和配置详解

Spring Boot 集成 Hikari 连接池及其原理和配置详解

在现代 Java 开发中,选择一个高效的数据库连接池至关重要。HikariCP 和 Druid 作为高性能的 JDBC 连接池,都因其独特的优势在开发者中备受青睐。在这篇文章中,我们将介绍如何在 Spring Boot 项目中集成 Hikari 连接池,并详细讲解其工作原理和主要配置参数。同时,我们将对比 HikariCP 和 Druid,介绍它们各自的优缺点。我们将基于一个简单的用户管理系统来进行示范。

一、项目环境

  • Spring Boot:用于快速构建 Spring 应用的框架。
  • MySQL:作为关系型数据库管理系统。
  • MyBatis:一个优秀的持久层框架,用于简化数据库操作。
  • HikariCP:高性能的 JDBC 连接池。
  • Druid:高效的数据库连接池,提供强大的监控和扩展功能。
  • Maven:项目管理和构建工具。
  • application.yml:Spring Boot 项目的配置文件。

二、项目搭建

首先,我们需要创建一个 Spring Boot 项目。你可以使用 Spring Initializr 快速生成项目,选择所需的依赖项,包括 Spring Web、Spring Data JPA、MySQL 驱动和 MyBatis。

1. 配置 pom.xml

在项目的 pom.xml 文件中添加所需的依赖:

<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://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>user-management</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>user-management</name>
    <description>User Management Application</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.4</version>
        <relativePath/>
    </parent>

    <properties>
        <java.version>11</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
            <version>3.4.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
2. 配置 application.yml

src/main/resources 目录下创建或编辑 application.yml 文件,添加 Hikari 数据源的配置:

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/inner-test?characterEncoding=UTF-8&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
    username: root
    password: 123456
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      connection-test-query: SELECT 1
      pool-name: DatebookHikariCP
      maximum-pool-size: 10
      minimum-idle: 5
      idle-timeout: 600000
      max-lifetime: 1800000
      connection-timeout: 30000
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.example.entity

三、Hikari 连接池原理及主要配置参数

1. HikariCP 简介

HikariCP 是一个高性能的 JDBC 连接池,它以其快速、轻量和高效的特点在众多连接池中脱颖而出。HikariCP 的设计目标是提供最小化的性能开销,并在高并发环境中提供优异的性能。

2. HikariCP 的工作原理

HikariCP 的核心是一个连接池管理器,它负责维护一个最小和最大数量的数据库连接。连接池管理器会在初始化时创建一些数据库连接,并根据需要动态增加或减少连接数量。当应用程序请求一个数据库连接时,连接池管理器会从池中分配一个可用的连接;当应用程序释放连接时,连接池管理器会将连接返回到池中,以便后续使用。

HikariCP 通过优化连接的获取和释放过程,以及减少不必要的开销,实现了极高的性能。同时,HikariCP 提供了一些高级功能,如连接泄漏检测、JMX 监控等,以帮助开发者更好地管理和监控数据库连接。

3. HikariCP 的主要配置参数
  • jdbc-url:数据库连接 URL。
  • username:数据库用户名。
  • password:数据库密码。
  • maximum-pool-size:连接池中最大连接数。
  • minimum-idle:连接池中最小空闲连接数。
  • idle-timeout:连接池中连接的空闲超时时间。
  • max-lifetime:连接在连接池中存活的最大时间。
  • connection-timeout:从连接池中获取连接的最大等待时间。

四、用户管理系统示例

为了演示如何集成 HikariCP 和使用它的主要配置参数,我们将创建一个简单的用户管理系统。这个系统允许我们进行用户的增删改查操作。

1. 数据库表设计

首先,在 MySQL 数据库中创建一个名为 userdb 的数据库,并创建一个 user 表:

CREATE DATABASE userdb;
USE userdb;

CREATE TABLE user (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(50) NOT NULL,
    password VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
2. 创建实体类

src/main/java/com/example/entity 目录下创建 User 类:

package com.example.entity;

import java.sql.Timestamp;

public class User {
    private Integer id;
    private String name;
    private String email;
    private String password;
    private Timestamp createdAt;

    // getters and setters
}
3. 创建 Mapper 接口

src/main/java/com/example/mapper 目录下创建 UserMapper 接口:

package com.example.mapper;

import com.example.entity.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface UserMapper {

    @Select("SELECT * FROM user WHERE id = #{id}")
    User getUserById(int id);

    @Select("SELECT * FROM user")
    List<User> getAllUsers();

    @Insert("INSERT INTO user(name, email, password, created_at) VALUES(#{name}, #{email}, #{password}, #{createdAt})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insertUser(User user);

    @Update("UPDATE user SET name=#{name}, email=#{email}, password=#{password} WHERE id=#{id}")
    void updateUser(User user);

    @Delete("DELETE FROM user WHERE id = #{id}")
    void deleteUser(int id);
}
4. 创建服务层

src/main/java/com/example/service 目录下创建 UserService 类:

package com.example.service;

import com.example.entity.User;
import com.example.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public User getUserById(int id) {
        return userMapper.getUserById(id);
    }

    public List<User> getAllUsers() {
        return userMapper.getAllUsers();
    }

    public void insertUser(User user) {
        userMapper.insertUser(user);
    }

    public void updateUser(User user) {
        userMapper.updateUser(user);
    }

    public void deleteUser(int id) {
        userMapper.deleteUser(id);
    }
}
5.

创建控制器

src/main/java/com/example/controller 目录下创建 UserController 类:

package com.example.controller;

import com.example.entity.User;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public User getUserById(@PathVariable int id) {
        return userService.getUserById(id);
    }

    @GetMapping
    public List<User> getAllUsers() {
        return userService.getAllUsers();
    }

    @PostMapping
    public void createUser(@RequestBody User user) {
        userService.insertUser(user);
    }

    @PutMapping("/{id}")
    public void updateUser(@PathVariable int id, @RequestBody User user) {
        user.setId(id);
        userService.updateUser(user);
    }

    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable int id) {
        userService.deleteUser(id);
    }
}

五、HikariCP 与 Druid 的对比

1. HikariCP 优缺点

优点

  • 性能高:HikariCP 在连接获取和释放方面进行了大量优化,性能表现优异。
  • 轻量级:HikariCP 代码量少,运行时占用内存低。
  • 简单配置:HikariCP 提供了一些常用的配置选项,使用方便。

缺点

  • 监控功能有限:相比 Druid,HikariCP 的内置监控功能较少。
  • 社区支持较少:HikariCP 的社区规模和文档资源相对较少。
2. Druid 优缺点

优点

  • 强大的监控功能:Druid 提供了丰富的监控和统计功能,可以详细了解连接池的运行状况。
  • 多种扩展功能:Druid 支持多种数据库,并且提供 SQL 解析、防火墙等功能。
  • 配置灵活:Druid 提供了大量的配置选项,可以根据需求进行细粒度的调整。

缺点

  • 性能稍逊:虽然 Druid 的性能也非常优秀,但在某些场景下,HikariCP 的表现更佳。
  • 较重:Druid 相比 HikariCP 更加复杂,运行时占用的资源也更多。

六、总结

在这篇文章中,我们详细介绍了如何在 Spring Boot 项目中集成 Hikari 连接池,并展示了一个简单的用户管理系统示例。同时,我们还对比了 HikariCP 和 Druid,介绍了它们各自的优缺点。

总的来说,HikariCP 以其高性能和轻量级的特点适合对性能有极高要求的应用,而 Druid 则以其强大的监控和扩展功能适合需要全面管理和监控数据库连接的应用。根据具体项目的需求,开发者可以选择合适的连接池来优化应用的性能和稳定性。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大骨熬汤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值