上次帮小王解决了如何在 Spring Boot 中使用 JDBC 连接 MySQL 后,我就一直在等,等他问我第三个问题,比如说如何在 Spring Boot 中使用 HikariCP 连接池。但我等了四天也没有等到任何音讯,似乎他从我的世界里消失了,而我却仍然沉醉在他拍我马屁的美妙感觉里。


突然感觉,没有小王的日子里,好空虚。怎么办呢?想来想去还是写文章度日吧,积极创作的过程中,也许能够摆脱对小王的苦苦思念。写什么好呢?

想来想去,就写如何在 Spring Boot 中使用 HikariCP 连接池吧。毕竟实战项目当中,肯定不能使用 JDBC,连接池是必须的。而 HikariCP 据说非常的快,快到 Spring Boot 2 默认的数据库连接池也从 Tomcat 切换到了 HikariCP(喜新厌旧的臭毛病能不能改改)。

HikariCP 的 GitHub 地址如下:

https://github.com/brettwooldridge/HikariCP

目前星标 12K,被使用次数更是达到了 43.1K。再来看看它的自我介绍。


牛逼的不能行啊,原来 Hikari 来源于日语,“光”的意思,这意味着快得像光速一样吗?讲真,看简介的感觉就好像在和我的女神“汤唯”握手一样刺激和震撼。

既然 Spring Boot 2 已经默认使用了 HikariCP,那么使用起来也相当的轻松惬意,只需要简单几个步骤。

01、初始化 MySQL 数据库

既然要连接 MySQL,那么就需要先在电脑上安装 MySQL 服务(本文暂且跳过),并且创建数据库和表。

CREATE DATABASE `springbootdemo`;
DROP TABLE IF EXISTS `mysql_datasource`;
CREATE TABLE `mysql_datasource` (
  `id` varchar(64) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

02、使用 Spring Initlallzr 创建 Spring Boot 项目

创建一个 Spring Boot 项目非常简单,通过 Spring Initlallzr(https://start.spring.io/)就可以了。


勾选 Web、JDBC、MySQL Driver 等三个依赖。

1)Web 表明该项目是一个 Web 项目,便于我们直接通过 URL 来实操。

3)MySQL Driver:连接 MySQL 服务器的驱动器。

5)JDBC:Spring Boot 2 默认使用了 HikariCP,所以 HikariCP 会默认在 spring-boot-starter-jdbc 中附加依赖,因此不需要主动添加 HikariCP 的依赖。

PS:怎么证明这一点呢?项目导入成功后,在 pom.xml 文件中,按住鼠标左键 + Ctrl 键访问 spring-boot-starter-jdbc 依赖节点,可在 spring-boot-starter-jdbc.pom 文件中查看到 HikariCP 的依赖信息。


选项选择完后,就可以点击【Generate】按钮生成一个初始化的 Spring Boot 项目了。生成的是一个压缩包,导入到 IDE 的时候需要先解压。

03、编辑 application.properties 文件

项目导入成功后,等待 Maven 下载依赖,完成后编辑 application.properties 文件,配置 MySQL 数据源信息。

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springbootdemo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456

是不是有一种似曾相识的感觉(和[上一篇]()中的数据源配置一模一样)?为什么呢?答案已经告诉过大家了——默认、默认、默认,重要的事情说三遍,Spring Boot 2 默认使用了 HikariCP 连接池。

04、编辑 Spring Boot 项目

为了便于我们查看 HikariCP 的连接信息,我们对 SpringBootMysqlApplication 类进行编辑,增加以下内容。

@SpringBootApplication
public class HikariCpDemoApplication implements CommandLineRunner {
    @Autowired
    private DataSource dataSource;

    public static void main(String[] args) {
        SpringApplication.run(HikariCpDemoApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        Connection conn = dataSource.getConnection();
        conn.close();
    }
}

HikariCpDemoApplication 实现了 CommandLineRunner 接口,该接口允许我们在项目启动的时候加载一些数据或者做一些事情,比如说我们尝试通过 DataSource 对象与数据源建立连接,这样就可以在日志信息中看到 HikariCP 的连接信息。CommandLineRunner 接口有一个方法需要实现,就是我们看到的 run() 方法。


通过 debug 的方式,我们可以看到,在项目运行的过程中,dataSource 这个 Bean 的类型为 HikariDataSource。

05、运行 Spring Boot 项目

接下来,我们直接运行 HikariCpDemoApplication 类,这样一个 Spring Boot 项目就启动成功了。


HikariDataSource 对象的连接信息会被打印出来。也就是说,HikariCP 连接池的配置启用了。快给自己点个赞。


06、为什么 Spring Boot 2.0 选择 HikariCP 作为默认数据库连接池

有几种基准测试结果可用来比较HikariCP和其他连接池框架(例如c3p0dbcp2tomcatvibur)的性能。例如,HikariCP团队发布了以下基准(可在此处获得原始结果):

HikariCP 团队为了证明自己性能最佳,特意找了几个背景对比了下。不幸充当背景的有 c3p0、dbcp2、tomcat 等传统的连接池。


从上图中,我们能感受出背景的尴尬,HikariCP 鹤立鸡群了。HikariCP 制作以如此优秀,原因大致有下面这些:

1)字节码级别上的优化:要求编译后的字节码最少,这样 CPU 缓存就可以加载更多的程序代码。

HikariCP 优化前的代码片段:

public final PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException
{
    return PROXY_FACTORY.getProxyPreparedStatement(this, delegate.prepareStatement(sql, columnNames));
}

HikariCP 优化后的代码片段:

public final PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException
{
    return ProxyFactory.getProxyPreparedStatement(this, delegate.prepareStatement(sql, columnNames));
}

以上两段代码的差别只有一处,就是 ProxyFactory 替代了 PROXY_FACTORY,这个改动后的字节码比优化前减少了 3 行指令。具体的分析参照 HikariCP 的 Wiki 文档

2)使用自定义的列表(FastStatementList)代替 ArrayList,可以避免 get() 的时候进行范围检查,remove() 的时候从头到尾的扫描。


07、鸣谢

好了,各位读者朋友们,答应小王的文章终于写完了。能看到这里的都是最优秀的程序员,升职加薪就是你了。如果觉得不过瘾,还想看到更多,可以 star 二哥的 GitHub【itwanger.github.io】,本文已收录。

PS:本文配套的源码已上传至 GitHub 【SpringBootDemo.SpringBootMysql】。

原创不易,如果觉得有点用的话,请不要吝啬你手中点赞的权力;如果想要第一时间看到二哥更新的文章,请扫描下方的二维码,关注沉默王二公众号。我们下篇文章见!


在 Spring Boot 中使用 HikariCP 连接池的更多相关文章

  1. Spring boot中配置HikariCP连接池

    # jdbc_config datasourcespring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasourc ...

  2. spring boot(10)-tomcat jdbc连接池

    默认连接池 tomcat jdbc是从tomcat7开始推出的一个连接池,相比老的dbcp连接池要优秀很多.spring boot将tomcat jdbc作为默认的连接池,只要在pom.xml中引入了 ...

  3. spring boot 学习(四)Druid连接池的使用配置

    Druid介绍 Druid是一个JDBC组件,druid 是阿里开源在 github 上面的数据库连接池,它包括三部分: * DruidDriver 代理Driver,能够提供基于Filter-Cha ...

  4. Spring boot (12) tomcat jdbc连接池

    默认连接池 tomcat jdbc是从tomcat7开始推出的一个连接池,相比老的dbcp连接池要优秀很多,spring boot将tomcat jdbc作为默认的连接池,只要在pom.xml中引入了 ...

  5. Spring框架中 配置c3p0连接池 完成对数据库的访问

    开发准备: 1.导入jar包: ioc基本jar jdbcTemplate基本jar c3p0基本jar 别忘了mysql数据库驱动jar 原始程序代码:不使用配置文件方式(IOC)生成访问数据库对象 ...

  6. Spring框架中 配置c3p0连接池

    开发准备: 1.导入jar包: ioc基本jar jdbcTemplate基本jar c3p0基本jar 别忘了mysql数据库驱动jar 原始程序代码:不使用配置文件方式(IOC)生成访问数据库对象 ...

  7. spring boot配置druid数据连接池

    Druid是阿里巴巴开源项目中一个数据库连接池. Druid是一个jdbc组合,包含三个部分, 1.DruidDriver代理Driver,能够提供基于Filter-Chain模式得插件体系2.Dru ...

  8. 被缠上了,小王问我怎么在 Spring Boot 中使用 JDBC 连接 MySQL

    上次帮小王入了 Spring Boot 的门后,他觉得我这个人和蔼可亲.平易近人,于是隔天小王又微信我说:"二哥,快教教我,怎么在 Spring Boot 项目中使用 JDBC 连接 MyS ...

  9. Spring Boot中如何配置线程池拒绝策略,妥善处理好溢出的任务

    通过之前三篇关于Spring Boot异步任务实现的博文,我们分别学会了用@Async创建异步任务.为异步任务配置线程池.使用多个线程池隔离不同的异步任务.今天这篇,我们继续对上面的知识进行完善和优化 ...

随机推荐

  1. .net core 基于AspNetCore.Identity+Identityserver4用户的权限管理

    一般权限控制,是先给角色分配对应权限,然后再给用户分配角色:总权限应该是在代码编写的时候就已经固定了,例如有个用户更新的接口,这里就会诞生一个用户更新的权限,接口在权限就在,没有接口也就没有了这个权限 ...

  2. 磨刀-CodeWarrior11生成的Makefile解析

    https://mp.weixin.qq.com/s/plvviDFLsLQeg9ZeP_3WMA   一. 简介 Code Warrior 11是基于Eclipse CDT开发的集成开发环境(IDE ...

  3. 使用turtle库绘制渐变的圆

    import turtle as t t.pensize(3) t.pencolor("blue") t.penup() t.fd(-250) t.seth(0) t.pendow ...

  4. Java实现 LeetCode 733 图像渲染(DFS)

    733. 图像渲染 有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间. 给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的 ...

  5. Java实现 LeetCode 447 回旋镖的数量

    447. 回旋镖的数量 给定平面上 n 对不同的点,"回旋镖" 是由点表示的元组 (i, j, k) ,其中 i 和 j 之间的距离和 i 和 k 之间的距离相等(需要考虑元组的顺 ...

  6. Java实现 蓝桥杯VIP 算法训练 王后传说

    问题描述 地球人都知道,在国际象棋中,后如同太阳,光芒四射,威风八面,它能控制横.坚.斜线位置. 看过清宫戏的中国人都知道,后宫乃步步惊心的险恶之地.各皇后都有自己的势力范围,但也总能找到相安无事的办 ...

  7. Java实现 LeetCode 99 恢复二叉搜索树

    99. 恢复二叉搜索树 二叉搜索树中的两个节点被错误地交换. 请在不改变其结构的情况下,恢复这棵树. 示例 1: 输入: [1,3,null,null,2] 1 / 3 \ 2 输出: [3,1,nu ...

  8. CDN百科 | 最近,你的APP崩了吗?

    过去几个月里,#xxx崩了#这个话题频繁出现在热搜榜上,让不少程序员小哥哥瑟瑟发抖. 从疫情宅家时期著名的视频APP“三连崩”,到全面复工开课后的在线教育平台与办公软件频繁宕机,再到报复性消费引发的点 ...

  9. Burpsuite intruder模块 越过token进行爆破,包含靶场搭建

    安装靶场 链接:https://pan.baidu.com/s/19X0oC63oO2cQKK6UL5xgOw 提取码:yq7f 下载完成放入网站根目录 点击初始化安装 出现错误,进行跟踪 发现是数据 ...

  10. RabbitMQ(2)---高级使用

    1.ack和限流 ack也就是消息确认签收,分为自动签收和手动签收.之前的交换机demo中:channel.basicConsume(queueName,true, consumer);  第二个参数 ...