MySQL, Oracle, Linux, 软件架构及大数据技术知识分享平台

网站首页 > 精选文章 / 正文

mybatis系列-5分钟hikaryCP、Druid、C3p0数据库连接池最全对比

2025-01-02 16:42 huorong 精选文章 3 ℃ 0 评论

背景

连接池是一种常用的技术,为什么需要连接池呢?这个需要从TCP说起。假如我们的服务器跟数据库没有部署在同一台机器,那么,服务器每次查询数据库都要先建立连接,一般都是TCP链接,建立连接就需要3次握手了,假设后台服务跟数据库的单程的访问时间需要10ms,那么光是建立连接就花了30ms,并且TCP还有慢启动的机制,实际上一次查询可能还不止1次TCP来回,查询效率就会大大降低。

为了解决上述问题,我们就需要维护一些长链接,这样就不用每次都去建立连接,毕竟建立连接除了占用时间,还需要一些其他的系统资源。另外的好处,连接池让我们更加容易地管理,一方面是可以避免数据库资源被某几个API占据,另一方面也可以避免资源泄露。

本文对现有的数据库接池做调研对比,综合性能,可靠性,稳定性,扩展性等因素推荐出最优的数据库连接池 。

测试结论

1:性能方面 hikariCP>druid>tomcat-jdbc>dbcp>c3p0 。hikariCP的高性能得益于最大限度地避免锁竞争。

2:druid功能最为全面,sql拦截等功能,统计数据较为全面,具有良好的扩展性。

3:综合性能,扩展性等方面,可考虑使用druid或者hikariCP连接池。

4:druid可开启prepareStatement缓存,对性能会有大概20%的提升。

功能对比

性能测试

环境配置:

1:获取关闭连接性能测试结果

测试说明:

  • 初始连接和最小连接均为5,最大连接为20。在borrow和return均不心跳检测
  • 其中打开关闭次数为: 100w次
  • 测试用例和mysql在同一台机器上面,尽量避免io的影响

测试结果:

  • 性能表现:hikariCP>druid>tomcat-jdbc>dbcp>c3p0。
  • hikariCP 的性能极其优异。hikariCP号称java平台最快的数据库连接池。
  • hikariCP在并发较高的情况下,性能基本上没有下降。
  • c3p0连接池的性能很差,不建议使用该数据库连接池。

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的处理效率。

2:查询一条语句性能测试

测试说明:

  • 初始连接和最小连接均为8,最大连接为8。
  • 在borrow和return均不心跳检测(即 testOnBorrow 参数设置为false,如果该参数为true,应用向连接池申请连接时,连接池会判断这条连接是否是可用的; testOnReturn参数设置为false,如果该参数为true, 当应用使用完连接,连接池回收连接的时候会判断该连接是否还可用,生产环境这两个参数一般都设置为false)
  • 查询的次数为10w次,查询的语句为 1:打开连接 2:执行 :select 1 3:关闭连接
  • 测试用例和mysql在同一台机器上面,尽量避免io的影响

测试数据 (单位:ms):

测试结果:

  • 在并发比较少的情况下,每个连接池的响应时间差不多。是由于并发少,基本上没有资源竞争。
  • 在并发较高的情况下,随着并发的升高,hikariCP响应时间基本上没有变动。
  • c3p0随着并发的提高,性能急剧下降。

Tags:druid参数配置

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言