SpringBoot 默认数据库连接池 HikariCP 简介


概述

HikariCP 是一个开源的 JDBC 数据库连接池项目。它一个非常轻量级(大约 130KB)且速度快如闪电的 JDBC 连接池框架,由 Brett Wooldridge 于 2012 年左右开发。


一、简介

有多个基准测试结果可用于将 HikariCP 与其他连接池框架(例如:c3p0、dbcp2、tomcat 和 vibur )的性能进行比较。例如,HikariCP 团队发布了以下基准(原始结果可在此处获取):

在这里插入图片描述

该框架之所以如此快,是因为应用了以下技术:

字节码级工程——已经完成了一些极端的字节码级工程(包括汇编级本机编码)
微观优化——虽然几乎无法衡量,但这些优化结合起来提高了整体性能
智能使用集合框架——ArrayList被替换为自定义类FastList,该类消除了范围检查并从头到尾执行删除扫描处获取):

二、集成 SpringBoot 使用

1.添加 Maven 依赖

代码如下(示例):

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
            <version>5.0.1</version>
        </dependency>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <version>8.0.33</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

HikariCP 还支持较旧的 JDK 版本,例如 6 和 7。可以分别在此处和此处找到合适的版本。我们还可以在 Central Maven Repository 中查看最新版本。

2.创建数据源

applicayion.yml 配置文件

spring:
  datasource:
    driver-class-name:  com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
    username: root
    password: root
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      pool-name: FxdDbPool
      minimum-idle: 10
      idle-timeout: 600000
      maximum-pool-size: 300
      auto-commit: true
      max-lifetime: 1800000
      connection-timeout: 180000

配置类 DataSourceConfig.java 创建 HikariCP 的 DataSource 实例:

package com.demo.config;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class DataSourceConfig {

    @Bean
    public DataSource dataSource(DataSourceProperties properties) {
        HikariConfig config = new HikariConfig();
        config.setUsername(properties.getUsername());
        config.setPassword(properties.getUsername());
        config.setJdbcUrl(properties.getUrl());
        config.setDriverClassName(properties.getDriverClassName());
        return new HikariDataSource(config);
    }
}

HikariConfig是用于初始化数据源的配置类。它附带了四个众所周知的必须使用的参数:username、password、jdbcUrl 和 driverClassName。

除了这些属性之外,我们可能找不到其他池化框架提供的其他几个可用属性:

  • autoCommit
  • connectionTimeout
  • idleTimeout
  • maxLifetime
  • connectionTestQuery
  • connectionInitSql
  • validationTimeout
  • maximumPoolSize
  • poolName
  • allowPoolSuspension
  • readOnly
  • transactionIsolation
  • leakDetectionThreshold
    HikariCP 因其这些数据库特性而脱颖而出。它甚至足够先进,可以自行检测连接泄漏。

可以在此处找到上述属性的详细说明。

3.使用数据源

现在我们已经定义了数据源,我们可以使用它从配置的连接池中获取连接,并执行 JDBC 相关操作。

假设我们有个部门表,名为 dept ,来模拟员工用例。我们将编写一个类来使用 HikariCP 从数据库中获取这些详细信息。

下面我们将列出创建示例数据所需的 SQL 语句:

create table dept(
  dept_no numeric,
  dept_name  varchar(14),
  loc    varchar(13),
  constraint pk_dept primary key (dept_no)
);

insert into dept values( 10, 'ACCOUNTING', 'NEW YORK');
insert into dept values( 20, 'RESEARCH', 'DALLAS');
insert into dept values( 30, 'SALES', 'CHICAGO' );
insert into dept values( 40, 'OPERATIONS', 'BOSTON');

数据表对应实体类 Dept.java:

package com.demo.model;

import lombok.Data;

@Data
public class Dept {

    private Integer deptNo;
    private String deptName;
    private String loc;
}

我们需要一个服务类,创建方法来从数据库中获取这些数据:
服务接口 DeptService.java:

import com.halcyon.model.Dept;

import java.sql.SQLException;
import java.util.List;

public interface DeptService {

    List<Dept> list() throws SQLException;

}

服务实现类:DeptServiceImpl.java

package com.demo.service.impl;

import com.demo.model.Dept;
import com.demo.service.DeptService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

@Slf4j
@AllArgsConstructor
@Service
public class DeptServiceImpl implements DeptService {

    private final DataSource dataSource;

    public List<Dept> list() throws SQLException {
        final String SQL_QUERY = "select * from dept";
        List<Dept> departments = new ArrayList<>();
        try (Connection connection = dataSource.getConnection();
             PreparedStatement pst = connection.prepareStatement(SQL_QUERY);
             ResultSet rs = pst.executeQuery()) {

            while (rs.next()) {
                Dept dept = new Dept();
                dept.setDeptNo(rs.getInt("dept_no"));
                dept.setDeptName(rs.getString("dept_name"));
                dept.setLoc(rs.getString("loc"));

                departments.add(dept);
            }
        }
        return departments;
    }
}

创建一个 JUnit 方法来测试它。由于我们知道表 dept 中的行数,因此我们可以预期返回列表的大小应等于行数:

package com.demo.service;

import com.demo.model.Dept;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.sql.SQLException;
import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
public class DeptServiceTest {

    @Autowired
    private DeptService deptService;

    @Test
    public void list_dept_test() throws SQLException {
        List<Dept> employees = deptService.list();
        assertEquals(4, employees.size());
    }
}

总结

在这篇简短的文章中,我们了解了使用 HikariCP 的好处、配置及其整合 SpringBoot 的使用方式。
测试源码:https://gitee.com/ora11g/hikari-cp-demo.git

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值