首页 > 基础资料 博客日记
SpringBoot集成Hikari连接池及其原理和配置详解
2024-10-03 10:00:07基础资料围观112次
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 则以其强大的监控和扩展功能适合需要全面管理和监控数据库连接的应用。根据具体项目的需求,开发者可以选择合适的连接池来优化应用的性能和稳定性。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
上一篇:详解Java之继承与多态
下一篇:Java Stream介绍