Java主流数据库连接池优劣及未来

主流数据库连接池常用的主流开源数据库连接池有C3P0、DBCP、Tomcat Jdbc Pool、BoneCP、Druid等
C3p0: 开源的JDBC连接池,实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展 。目前使用它的开源项目有Hibernate、Spring等 。单线程,性能较差,适用于小型系统,代码600KB左右 。
DBCP (Database Connection Pool):由Apache开发的一个JAVA数据库连接池项目,Jakarta commons-pool对象池机制,Tomcat使用的连接池组件就是DBCP 。单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar,预先将数据库连接放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完再放回 。单线程,并发量低,性能不好,适用于小型系统 。
Tomcat Jdbc Pool:Tomcat在7.0以前都是使用common-dbcp做为连接池组件,但是dbcp是单线程,为保证线程安全会锁整个连接池,性能较差,dbcp有超过60个类,也相对复杂 。Tomcat从7.0开始引入了新增连接池模块叫做Tomcat jdbc pool,基于Tomcat JULI,使用Tomcat日志框架,完全兼容dbcp,通过异步方式获取连接,支持高并发应用环境,超级简单核心文件只有8个,支持JMX,支持XA Connection 。
BoneCP:官方说法BoneCP是一个高效、免费、开源的Java数据库连接池实现库 。设计初衷就是为了提高数据库连接池性能,根据某些测试数据显示,BoneCP的速度是最快的,要比当时第二快速的连接池快25倍左右,完美集成到一些持久化产品如Hibernate和DataNucleus中 。BoneCP特色:高度可扩展,快速;连接状态切换的回调机制;允许直接访问连接;自动化重置能力;JMX支持;懒加载能力;支持XML和属性文件配置方式;较好的Java代码组织,100%单元测试分支代码覆盖率;代码40KB左右 。
Druid:Druid是Java语言中最好的数据库连接池,Druid能够提供强大的监控和扩展功能,是一个可用于大数据实时查询和分析的高容错、高性能的开源分布式系统,尤其是当发生代码部署、机器故障以及其他产品系统遇到宕机等情况时,Druid仍能够保持100%正常运行 。主要特色:为分析监控设计;快速的交互式查询;高可用;可扩展;Druid是一个开源项目,源码托管在github上 。
主流连接池各项功能对比如下:

Java主流数据库连接池优劣及未来

文章插图
Java数据库连接池比较
我们再看一组有HikariCP的比较:
Java主流数据库连接池优劣及未来

文章插图
各色连接池比较
HikariCP性能分析:
  • HikariCP通过优化(concurrentBag,fastStatementList )集合来提高并发的读写效率 。
  • HikariCP使用threadlocal缓存连接及大量使用CAS的机制,最大限度的避免lock 。单可能带来cpu使用率的上升 。
  • 从字节码的维度优化代码 。(default inline threshold for a JVM running the server Hotspot compiler is 35 bytecodes )让方法尽量在35个字节码一下,来提升jvm的处理效率 。
HikariCP做的优化补充如下:
Java主流数据库连接池优劣及未来

文章插图
优化补充说明

Java主流数据库连接池优劣及未来

文章插图
内联描述
MySQL connecter 源码里用的就是ping命令:
Java主流数据库连接池优劣及未来

文章插图
 
比HikariCP更快的数据库连接池一个同事告诉我,比hikari还快的连接池他也用过、研究过,
https://github.com/mauricio/postgresql-async
这是scala生态圈的东西 。用netty实现了mysql协议,没用mysql官方的connector,纯异步的,它的连接池是写的比较随便,但是性能依然很好 。
前瞻,未来到底是HikariCP还是Druid的天下?很多人都在问,站在巨人肩膀上的第二代连接池HikariCP和druid到底孰强孰弱?其实我觉得这是一个不必讨论的问题 。
我们先来看看未来的趋势:单机的操作系统将会被抛弃,取而代之的是容器调度加编排的云操作系统 。裸机或者虚拟机的运行时也将会被容器取代 。通信方面将会使用Service Mesh 。
也就是说中间件最后的趋势一定是弱化到无感知,这才是最终的一个大道至简的方向 。那些maven依赖问题,把二方库写在pom里,监控等代码的硬编码进应用里都将逐渐弱化到不复存在,取而代之的那些java agent(如pinpoint、skywalking之类),抑或是service mesh这种side car模式都是可以做中间件(包括连接池)的监控的 。
一个有赞的朋友告诉我,在有赞核心应用,用HikariCP替换durid后,RT出现断崖式下滑(1.5ms ~ 1.2ms) 并且持续稳定毛刺少 。性能测试与压测之后,一核心系统与druid相比,性能提高一倍左右 。


推荐阅读