网站首页 > 精选文章 / 正文
背景
连接池是一种常用的技术,为什么需要连接池呢?这个需要从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参数配置
猜你喜欢
- 2025-01-02 Java 与 MySQL 数据库连接池优化:提升数据访问效率的关键策略
- 2025-01-02 Spring Boot 入门系列(二十四)多环境配置,3分钟搞定
- 2025-01-02 rust druid 实现自己的自定义小部件
- 2025-01-02 搞懂Druid之连接获取和归还
- 2025-01-02 Apache Druid连接开通Kerberos认证的Kafka处理过程
- 2025-01-02 非Spring Boot 或 Spring Cloud 项目如何集成Druid数据源
- 2025-01-02 Spring Boot 2.x基础教程:默认数据源Hikari的配置详解
- 2025-01-02 连接池:别让连接池帮了倒忙
- 2025-01-02 SpringBoot事务事件监听:事务事件监听注解详细使用示例(二)
- 2025-01-02 SpringBoot实现动态数据源配置