数据库连接池性能比对(hikari druid c3p0 dbcp jdbc)
https://blog.csdn.net/qq_31125793/article/details/51241943
背景
对现有的数据库连接池做调研对比,综合性能,可靠性,稳定性,扩展性等因素选出推荐出最优的数据库连接池 。
NOTE: 本文所有测试均是MySQL库
测试结论
1:性能方面 hikariCP>druid>tomcat-jdbc>dbcp>c3p0 。hikariCP的高性能得益于最大限度的避免锁竞争。
2:druid功能最为全面,sql拦截等功能,统计数据较为全面,具有良好的扩展性。
3:综合性能,扩展性等方面,可考虑使用druid或者hikariCP连接池。
4:可开启prepareStatement缓存,对性能会有大概20%的提升。
功能对比
功能 | dbcp | druid | c3p0 | tomcat-jdbc | HikariCP |
是否支持PSCache | 是 | 是 | 是 | 否 | 否 |
监控 | jmx | jmx/log/http | jmx,log | jmx | jmx |
扩展性 | 弱 | 好 | 弱 | 弱 | 弱 |
sql拦截及解析 | 无 | 支持 | 无 | 无 | 无 |
代码 | 简单 | 中等 | 复杂 | 简单 | 简单 |
更新时间 | 2015.8.6 | 2015.10.10 | 2015.12.09 | 2015.12.3 | |
特点 | 依赖于common-pool | 阿里开源,功能全面 | 历史久远,代码逻辑复杂,且不易维护 | 优化力度大,功能简单,起源于boneCP | |
连接池管理 | LinkedBlockingDeque | 数组 | FairBlockingQueue | threadlocal+CopyOnWriteArrayList |
- 由于boneCP被hikariCP替代,并且已经不再更新,boneCP没有进行调研。
- proxool网上有评测说在并发较高的情况下会出错,proxool便没有进行调研。
- druid的功能比较全面,且扩展性较好,比较方便对jdbc接口进行监控跟踪等。
- c3p0历史悠久,代码及其复杂,不利于维护。并且存在deadlock的潜在风险。
性能测试
环境配置:
CPU | Intel(R) Xeon(R) CPU E5-2430 v2 @ 2.50GHz,24core |
msyql version | 5.5.46 |
tomcat-jdbc version | 8.0.28 |
HikariCP version | 2.4.3 |
c3p0 Version | 0.9.5-pre8 |
dbcpVersion | 2.0.1 |
druidVersion | 1.0.5 |
1:获取关闭连接性能测试
测试说明:
- 初始连接和最小连接均为5,最大连接为20。在borrow和return均不心跳检测
- 其中打开关闭次数为: 100w次
- 测试用例和mysql在同一台机器上面,尽量避免io的影响
- 使用mock和连接mysql在不同线程并发下的响应时间
图形:
mock性能数据 (单位:ms)
5 | 20 | 50 | 100 | |
tomcat-jdbc | 442 | 447 | 1,013 | 1,264 |
c3p0 | 4,480 | 5,527 | 7,449 | 10,725 |
dbcp | 676 | 689 | 867 | 1,292 |
hikari | 38 | 33 | 38 | 30 |
druid | 291 | 293 | 562 | 985 |
mysql性能数据 (单位:ms)
5 | 20 | 50 | 100 | |
tomcat-jdbc | 436 | 453 | 1,033 | 1,291 |
c3p0 | 4,378 | 5,726 | 7,975 | 10,948 |
dbcp | 671 | 679 | 897 | 1,380 |
hikari | 96 | 82 | 87 | 78 |
druid | 304 | 424 | 690 | 1,130 |
测试结果:
- mock和mysql连接性能表现差不多,主要是由于初始化的时候建立了连接后期不再建立连接,和使用mock连接逻辑一致。
- 性能表现: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均不心跳检测
- 查询的次数为10w次,查询的语句为 1:打开连接 2:执行 :select 1 3:关闭连接
- 测试用例和mysql在同一台机器上面,尽量避免io的影响
图形:
测试数据:
5 | 8 | 20 | 50 | 100 | |
tomcat-jdbc | 2,178 | 1,495 | 1,769 | 1,818 | 1,858 |
c3p0 | 3,237 | 3,451 | 4,488 | 5,994 | 7,906 |
dbcp | 2,816 | 1,935 | 2,097 | 2,243 | 2,280 |
hikari | 2,299 | 1,546 | 1,682 | 1,751 | 1,772 |
druid | 2,297 | 1,551 | 1,800 | 1,977 | 2,032 |
测试结果:
- 在并发比较少的情况下,每个连接池的响应时间差不多。是由于并发少,基本上没有资源竞争。
- 在并发较高的情况下,随着并发的升高,hikariCP响应时间基本上没有变动。
- c3p0随着并发的提高,性能急剧下降。
3:pscache性能对比
测试说明:
- 通过druid进行设置pscache和不设置pscache的性能对比
- 初始连接和最小连接均为8,最大连接为8。在borrow和return均不心跳检测。并且执行的并发数为8.
- 查询10w次。查询流程为:1:建立连接,2:循环查询preparestatement语句 3:close连接
- 测试用例和mysql在同一台机器上面,尽量避免io的影响
测试数据:
cache | 1,927 |
not cache | 2,134 |
测试结果:
- 开启psCache缓存,性能大概有20%幅度的提升。可考虑开启pscache.
测试说明:
- psCache是connection私有的,所以不存在线程竞争的问题,开启pscache不会存在竞争的性能损耗。
- psCache的key为prepare执行的sql和catalog等,value对应的为prepareStatement对象。开启缓存主要是减少了解析sql的开销。
数据库连接池性能比对(hikari druid c3p0 dbcp jdbc)的更多相关文章
- 主流数据库连接池性能比较 hikari druid c3p0 dbcp jdbc
背景 对现有的数据库连接池做调研对比,综合性能,可靠性,稳定性,扩展性等因素选出推荐出最优的数据库连接池 . NOTE: 本文所有测试均是MySQL库 测试结论 1:性能方面 hikariCP> ...
- 转!数据库连接池概念、种类、配置(DBCP\C3P0\JndI与Tomact配置连接池)
数据库连接池概念.种类.配置(DBCP\C3P0\JndI与Tomact配置连接池) 一.DBCP 连接:DBCP 连接池是 Apache 软件基金组织下的一个开源连接池实现. 需要的 java 包c ...
- 数据库连接池,DBUtil的模板,dbcp,c3p0
数据库连接池,DBUtil的模板,Druid使用(重点) 一.DBUtil模板 public class DBUtilTest { public static Connection connectio ...
- 三种数据库连接池的配置及使用(For JDBC)
DBCP 一.导包 Apache官网下载DBCP包,导入两个包路径如下: commons-dbcp-1.4-bin\commons-dbcp-1.4\commons-dbcp-1.4.jar:连接池的 ...
- java_JDBC,连接数据库方式,RestSet结果集,Statement,PreparedStatement,事务,批处理,数据库连接池(c3p0和Druid)、Apache-DBUtils、
一.JDBC的概述 1.JDBC为访问不同的数据薛是供了统一的接口,为使用者屏蔽了细节问题.2. Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作 ...
- JDBC学习笔记(8)——数据库连接池(dbcp&C3P0)
JDBC数据库连接池的必要性 一.在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 1)在主程序(如servlet/beans)中建立数据库连接 2)进行sql操作 3)断开数据库连接 ...
- 【转】JDBC学习笔记(8)——数据库连接池(dbcp&C3P0)
转自:http://www.cnblogs.com/ysw-go/ JDBC数据库连接池的必要性 一.在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 1)在主程序(如servlet/ ...
- JDBC(三)数据库连接池(DBCP、C3P0)
前言 这段时间状态有一点浮躁,希望自己静下心来.还有特别多的东西还没有学懂.需要学习的东西非常的多,加油! 一.JDBC复习 Java Data Base Connectivity,java数据库连接 ...
- c3p0数据库连接池无法连接数据库—错误使用了username关键字
一.问题描述 上篇博客说到了关于maven无法下载依赖jar包的问题,这篇博客再说一下关于在本个项目中遇到的关于使用C3P0连接池连接数据库的问题,真心很奇葩,在此,也请大家引起注意.首先看我的项目基 ...
随机推荐
- Android客户端与服务器交互方式-小结
最近的Android项目开发过程中一个问题困扰自己很长时间,Android客户端与服务器交互有几种方式,最常见的就是webservices和json.要在Android手机客户端与pc服务器交互,需要 ...
- 在Mac上使用vs-code快速上手c语言学习(入门文,老鸟退散)
天下事,合久必分.分久必合,你肯定想不到当你逃离到Mac平台这么多年之后,有一天你会再用微软的产品来写代码 :) 其实微软的产品虽然用户体验总是做不到最好,但整体上的确拉低了行业的进入门槛,对于编程也 ...
- Linux环境下tomcat的安装与使用
1.tomcat安装 1.1.前提条件: 需要准备一台Linux机器,我选择的是Ubuntu18. Linux机器上已经安装了JDK,使用java -version命令查看是否安装. stephen@ ...
- leetcode — valid-palindrome
/** * Source : https://oj.leetcode.com/problems/valid-palindrome/ * * * Given a string, determine if ...
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU特性介绍(2)- RT1052DVL6性能实测
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的性能. 在前面的文章 i.MXRT微控制器概览 里,痞子衡给大家简介过恩智浦半导体在2017年推出的新 ...
- Perl一行式:文本编解码、替换
perl一行式程序系列文章:Perl一行式 文本大小写转换 全部字符转换成大写或小写,有几种方式: # 转大写 $ perl -nle 'print uc' file.log $ perl -ple ...
- 大前端的自动化工厂(2)—— SB Family
原文链接:https://bbs.huaweicloud.com/blogs/53c0c3509b7a11e89fc57ca23e93a89f 我坦白我是标题党,SB只是SCSS-Bourbon的简写 ...
- NLP入门(六)pyltp的介绍与使用
pyltp的简介 语言技术平台(LTP)经过哈工大社会计算与信息检索研究中心 11 年的持续研发和推广, 是国内外最具影响力的中文处理基础平台.它提供的功能包括中文分词.词性标注.命名实体识别.依 ...
- CANVAS画布与SVG的区别
CANVAS是html5提供的新元素<canvas>,而svg存在的历史要比canvas久远,svg并不是html5专有的标签,最初svg是用xml技术(超文本扩展语言,可以自定义标签或属 ...
- Object.keys 及表单清空
Object.keys 返回一个所有元素为字符串的数组,其元素来自于从给定的object上面可直接枚举的属性.这些属性的顺序与手动遍历该对象属性时的一致. // simple array var ar ...