上次帮小王解决了如何在 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,那么使用起来也相当的轻松惬意,只需要简单几个步骤。
既然要连接 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;
创建一个 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 的时候需要先解压。
项目导入成功后,等待 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 连接池。
为了便于我们查看 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。
接下来,我们直接运行 HikariCpDemoApplication
类,这样一个 Spring Boot 项目就启动成功了。
HikariDataSource 对象的连接信息会被打印出来。也就是说,HikariCP 连接池的配置启用了。快给自己点个赞。
有几种基准测试结果可用来比较HikariCP和其他连接池框架(例如 c3p0 , dbcp2 , tomcat 和 vibur)的性能 。例如,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()
的时候从头到尾的扫描。
------------------
公众号:沉默王二(ID:cmower)
CSDN:沉默王二
这是一个有颜值却靠才华吃饭的程序员,你知道,他的文章风趣幽默,读起来就好像花钱一样爽快。
长按下图二维码关注,你将感受到一个有趣的灵魂, 且每篇文章都有干货。
-------------- --- -
原创不易,莫要白票,如果觉得有点用的话,请毫不留情地转发朋友圈吧 ,因为这将是我写作更多优质文章的最强动力。