HikariCP连接池如何实现高效且稳定的查询?

摘要:上两篇文章,我们讲到了Spring中如何配置单数据源和多数据源,配置数据源的时候,连接池有很多选择,在SpringBoot 1.0中使用的是Tomcat的DataSource,在SpringBoot 2.0中,我们使用默认连接池是Hikar
上两篇文章,我们讲到了Spring中如何配置单数据源和多数据源,配置数据源的时候,连接池有很多选择,在SpringBoot 1.0中使用的是Tomcat的DataSource,在SpringBoot 2.0中,我们使用默认连接池是HikariCP,本文讲一下HikariCP。 为什么SpringBoot 2.0要选择HikariCP来作为默认的连接池呢? 我们先看一下官网的一张对比图。 一个连接周期定义为单个DataSource.getConnection()/ Connection.close()。 一个语句周期定义为单个Connection.prepareStatement(), Statement.execute(), Statement.close() 从上图看出,HikariCP和常见的连接池相比,优势非常明显。 为什么HikariCP那么快呢?根据官网概要总结了以下几点 字节码精简 :字节码级别优化(很多⽅法通过 JavaAssist ⽣成),直到编译后的字节码最少,这样,CPU缓存可以加载更多的程序代码; 优化代理和拦截器:减少代码,例如HikariCP的Statement proxy只有100行代码,只有BoneCP的十分之一; 自定义数组类型:(FastStatementList)代替ArrayList:避免每次get()调用都要进行range check,避免调用remove()时的从头到尾的扫描; 自定义集合类型(ConcurrentBag:提高并发读写的效率; 代理类的优化(⽐如,⽤ invokestatic 代替了 invokevirtual) 其他针对BoneCP缺陷的优化,比如对于耗时超过一个CPU时间片的方法调用的研究(但没说具体怎么优化)。
阅读全文