SpringBoot2.0 中 HikariCP 数据库连接池原理解析

yizhihongxing

Spring Boot 2.0 中 HikariCP 数据库连接池原理解析

什么是数据库连接池?

在讲解 HikariCP 数据库连接池原理前,我们先简单介绍一下什么是数据库连接池。在 web 应用程序中,经常需要与数据库进行交互,如果每次请求都新建一个数据库连接,会造成很多不必要的性能损耗,因此我们需要将连接缓存起来,以便下次需要连接时能够快速获取。连接池就像一个集装箱,里面存放着多个数据库连接,程序可以从集装箱中取出连接使用,当不需要连接的时候,将连接放回集装箱中,而不是销毁连接,在下次需要连接时再次使用。

什么是 HikariCP?

HikariCP 是一个高性能的 JDBC 数据库连接池,号称是目前最快最小的连接池之一。它在 Spring Boot 2.0 中被默认采用,用来替代 Spring Boot 1.x 中的 Tomcat 连接池。它通过复用已经创建的连接对象,减少了客户端与服务器端之间大量的无谓通讯,从而提高了数据库连接的效率。

HikariCP 的原理

HikariCP 的主要原理是通过维护一个连接池来复用连接,减少了每次请求都需要建立和销毁连接的开销。连接池中的连接对象是提前创建好的,并且在连接闲置时不会被销毁,而是被放入连接池中,用来处理下一个请求。当有新的请求需要连接时,会从连接池中取出一个可用的连接。当连接池中没有可用连接时,请求会等待直到有可用连接或者超时。连接池中的连接对象有一个最大的存活时间,当连接对象存活时间超过这个时间时,连接对象将会被销毁并从连接池中移除。

HikariCP 还有一些其他特性,例如自适应瑞氧线程池大小、故障自动重试等。这些特性都可以通过 HikariCP 的参数进行配置。

HikariCP 的配置

HikariCP 的配置可以在 application.properties 或者 application.yml 文件中进行配置。以下是一些常用的配置项:

# 数据库连接配置
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

# 连接池配置(以 HikariCP 为例)
spring.datasource.hikari.minimumIdle=5
spring.datasource.hikari.maximumPoolSize=20
spring.datasource.hikari.idleTimeout=60000

在上面的示例中,我们将 spring.datasource.hikari 下的参数设置为连接池的配置信息。其中 minimumIdle 表示连接池中维护的最小空闲连接数量, maximumPoolSize 表示连接池中连接的最大数量, idleTimeout 表示连接的最大空闲时间。当连接数量超过 maximumPoolSize 时,新的请求将会排队等待连接池中释放连接。

示例

下面我们来给出两个简单的示例,演示如何使用 HikariCP 数据库连接池。

示例一:基本使用

在基本使用示例中,我们创建一个数据库表 user,并实现一个包含 100 条记录的用户列表。我们使用 HikariCP 连接池来操作数据库。

@RestController
public class UserController {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @GetMapping("/users")
    public List<User> getUsers() {
        String sql = "SELECT * FROM user";
        return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
    }

    @PostMapping("/users")
    public int addUser(@RequestBody User user) {
        String sql = "INSERT INTO user(id,username,password,age) VALUES(?,?,?,?)";
        return jdbcTemplate.update(sql, user.getId(), user.getUsername(), user.getPassword(), user.getAge());
    }
}

在上面的示例中,我们使用了 Spring JDBC 模板来操作数据库。其中 @GetMapping("/users") 注解表示对应的 URL 路径为 /users,并且使用 GET 请求方式,@PostMapping("/users") 注解表示对应的 URL 路径为 /users,并且使用 POST 请求方式。

示例二:高级使用

在高级使用示例中,我们将连接池的配置信息从 application.properties 文件中读取,并且采用 Sping Data JPA 进行数据库操作。

首先,我们需要在 pom.xml 文件中添加 Spring Data JPA、HikariCP 和 MySQL 的依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

然后,在 application.properties 文件中添加 HikariCP 的配置信息:

spring.datasource.hikari.minimumIdle=5
spring.datasource.hikari.maximumPoolSize=20
spring.datasource.hikari.idleTimeout=60000

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

最后,我们定义一个 UserRepository 接口,继承自 JpaRepository 接口,在该接口中实现对用户表的操作:

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
}

UserController 类中,注入 UserRepository 接口,并实现查询和新增用户的方法:

@RestController
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @GetMapping("/users")
    public List<User> getUsers() {
        return userRepository.findAll();
    }

    @PostMapping("/users")
    public User addUser(@RequestBody User user) {
        return userRepository.save(user);
    }
}

在上面的示例中,我们使用了 Spring Data JPA 来实现了对用户表的操作。其中 @Autowired 注解表示自动注入对应类型的 Bean。@GetMapping("/users") 注解表示对应的 URL 路径为 /users,并且使用 GET 请求方式,@PostMapping("/users") 注解表示对应的 URL 路径为 /users,并且使用 POST 请求方式。

以上就是 HikariCP 数据库连接池的原理解析和使用示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot2.0 中 HikariCP 数据库连接池原理解析 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 使用redis作为缓存,数据还需要存入数据库中吗?(转)

    转自https://blog.csdn.net/wypersist/article/details/79955704 使用redis作为缓存,数据还需要存入数据库中吗?     我的答案是: 1redis只是缓存,不是数据库如mysql,所以redis中有的数据库,mysql中一定有。 2用户请求先去请求redis,如果没有,再去数据库中去读取。 3redi…

    Redis 2023年4月11日
    00
  • CentOS 安装 PHP5.5+Redis+XDebug+Nginx+MySQL全纪录

    这里是 CentOS 安装 PHP5.5+Redis+XDebug+Nginx+MySQL全纪录的完整攻略,包括安装过程和示例说明。 1. 安装 CentOS 首先,我们需要在服务器上安装 CentOS 操作系统。可以从 CentOS 官网上下载镜像文件,并使用制作安装盘或者使用虚拟机等方式安装。 2. 安装必要的软件 安装 CentOS 后,我们需要安装一…

    database 2023年5月22日
    00
  • 浅谈Redis的事件驱动模型

    浅谈Redis的事件驱动模型 什么是事件驱动模型 事件驱动模型是指基于事件和回调的编程方式。在事件驱动模型中,程序并不会一直轮询某个IO处理器、关键组件或设备是否有新的操作。相反,程序在启动之后,可以设置事件监听器或回调函数来处理触发的事件。当事件发生时,相关的回调函数会被执行。这种模型使得程序能够实时响应事件和操作,避免了轮询等待事件的浪费。 Redis的…

    database 2023年5月22日
    00
  • Python数据库sqlite3图文实例详解

    我来为您介绍一下“Python数据库sqlite3图文实例详解”的完整攻略。 什么是sqlite3 sqlite3是一种轻量级的、自包含、零配置的、服务进程化的、事务性的SQL数据库引擎。它在很多嵌入式设备上被广泛使用,其设计简单而高效,适合用作移动设备和许多小型应用程序的后端存储。 sqlite3的优点: 体积小,可以很方便地嵌入到项目当中 使用简单,不需…

    database 2023年5月18日
    00
  • Oracle ORA-00904:标识符无效解决方法(太坑了!!)

    当我们在使用Oracle数据库时,有可能遇到”ORA-00904:标识符无效”的错误,这是Oracle提示我们所使用的标识符不存在或者无效,这个错误可能出现在SQL语句中的任何地方,如列名、表名、函数名等,下面针对这个错误提供完整的解决攻略。 1. 检查拼写错误 ORA-00904错误最常见的原因是拼写错误,当你使用SQL语句时,需要仔细检查是否有错别字,如…

    database 2023年5月21日
    00
  • SQL Server模糊查询的常见方法总结

    (SQL Server模糊查询的常见方法总结)[### SQL Server模糊查询的常见方法总结] 在实际的SQL Server数据查询过程中,模糊查询是非常常见的需求。本文总结了SQL Server中常见的模糊查询方法,旨在帮助读者更高效地完成模糊查询操作。 1. LIKE 运算符 LIKE运算符是SQL Server中最常见的用于模糊查询的操作符之一,…

    database 2023年5月21日
    00
  • MySql查询不区分大小写解决方案(两种)

    MySQL查询默认是区分大小写的,如果需要进行不区分大小写的查询,可以采用以下两种解决方案: 方案一:使用LOWER/UPPER函数 LOWER/UPPER函数可以将字符串转换为小写/大写格式,转换后再进行查询,达到不区分大小写的效果。 示例一:查询名字为”Tom”的用户信息(不区分大小写) SELECT * FROM user WHERE LOWER(na…

    database 2023年5月21日
    00
  • MySQL数据库安装后服务无法启动的解决办法

    MySQL是一款非常流行的关系型数据库管理系统,但在安装MySQL过程中,有时会出现无法启动MySQL服务的情况。这时我们需要进行修复,以下是MySQL数据库服务无法启动的解决方法的完整攻略: 1. 检查错误日志文件 如果MySQL服务无法启动,一般是由于配置文件中有错或者数据库文件损坏导致的。我们首先需要检查MySQL的错误日志文件。错误日志文件一般位于M…

    database 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部