数据库连接池性能横向比对(hikari druid c3p0 dbcp jdbc)_小平_的博客-程序员宅基地

技术标签: JavaEE  

背景

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

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的开销。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xiaoping0915/article/details/70160257

智能推荐

条件注解@ConditionalOnBean失效原因_zhm_sky的博客-程序员宅基地_conditionalonbean不生效

测试环境(配置类)@Import({User.class,Pet.class})@Configuration(proxyBeanMethods = true)public class MyConfig { @Bean @ConditionalOnBean(name = "cat") public User user(){ return new User("航书", 12); } @Bean("cat") public

一重指针、二重指针做函数参数的深刻分析(虽然很基础,但要深刻理解)_ShenHang_的博客-程序员宅基地

一重指针做函数参数#include<iostream>using namespace std;void change(int *p){ *p = 20; p++; cout << p << endl;}int main() { int a = 10; change(&a); cout << &a <&lt...

java设置图片点击渐变透明,图片实现渐变/透明效果_weixin_39569753的博客-程序员宅基地

众所周知,图片等一些盒子都可以利用opacity属性来设置不透明度,但是前两天我朋友忽然给我一个截图,截图效果如下图中红框圈住的位置图片或者说摄像头采集的画面出现了渐变到透明,可以清楚的看到可以看到后面小哥的胳膊,然后问我如何实现这种效果,这下把我难住了(呵 天天给我出难题),我开始在个大论坛开始寻找解决方案;忽然在前天,日常逛论坛时看到一个文字投影的效果,而后忽然灵机一动就想,能不能变相的实现前...

java笔记_笑容温暖城寨的博客-程序员宅基地

安卓课的Java扩展笔记包类命名规范总结输出换行与不换行mian方法中的args参数Math类快捷输出语句static关键字定义无参方法定义带返回值方法包package com.eoe.basic.day01;//包名 在java当中用.表示windos中的/,一般格式:com.公司名.项目名.业务模块名称例如:com.sina.crm.user类命名规范总结1、java中可以有多个类2、java中可以有多个类,但是最多只有一个类的类名和文件名相同3、如果一个类被public修饰,那该类

一、网络游戏架构的前世今生(2)_王元恺David的博客-程序员宅基地

网络游戏架构演进史,优化游戏网络,自定义网络协议

在Chrome 浏览器上滚动截屏_ianly梁炎的博客-程序员宅基地_横向滚动截图

浏览器滚动截屏,截取整个页面 在Chrome 浏览器上滚动截屏,不需要插件和任何 app,利用 chrome 浏览器原生功能即可实现。打开 Chrome 浏览器,进入需要截图的网站页面打开开发者工具:在页面任何地方点击鼠标右键,在弹出菜单中选择「检查」选项。或者使用快捷键组合:option + command + i。打开命令行(command palette):command + s...

随便推点

手把手教你使用FineUI+动软代码生成器开发一个b/s结构的取送货管理信息系统(附源码)之开篇_编程鸭的博客-程序员宅基地

一 本系列随笔概览及产生的背景近阶段接到一些b/s类型的软件项目,但是团队成员之前大部分没有这方面的开发经验,于是自己选择了一套目前网上比较容易上手的开发框架(FineUI),计划录制一套视频讲座,来讲解如何利用FineUI快速开发一个小型的b/s结构的管理系统,已达到帮助团队成员快速掌握b/s结构信息系统的开发方法。源码位置:https://github.com/kamiba/FineU...

[原创]FineUI秘密花园(一) — 为什么选择FineUI?_weixin_33778778的博客-程序员宅基地

首先来看看FineUI是什么? FineUI 是一组基于 ExtJS 的专业 ASP.NET 控件库,拥有原生的 AJAX 支持和华丽的 UI 效果。 FineUI 的使命是创建没有 JavaScript,没有 CSS,没有 UpdatePanel,没有 ViewState,没有 WebServices 的网站应用程序。   从这段官方描述中,我们看到了三个信息点: ...

FineUI布局应用(二)_weixin_30767921的博客-程序员宅基地

一、FineUI页面布局分为 1、Fit布局 1 <f:Panel ID="Panel1" Title="布局Fit(Layout=Fit)" runat="server" Layout="Fit" Height="300px" EnableFrame="true" EnableCollapse="true" 2 BodyPa...

[蓝桥杯][2019年第十届真题]修改数组_深夜面包的博客-程序员宅基地

题目链接:修改数组解题思路:用并查集思路,如果一个数的父节点就是当前数的位置,如果标记下一个数值一样的数的位置+1#include<bits/stdc++.h>#define x first#define y second#define mem1(h) memset(h,-1,sizeof h)#define mem0(h) memset(h,0,sizeof h)#define mcp(a,b) memcpy(a,b,sizeof b)using namespace std

GO语言博客系统——(一、基础部分)_深夜学习家的博客-程序员宅基地_go 博客系统

目录前言一、简单go web程序1.简单程序2.注意点二、路由1.路由比较2.请求路径正则三、中间件总结前言菜鸡自留地,如有错误请指正谢谢。一、简单go web程序1.简单程序package mainimport ( "fmt" "net/http")func handlerFunc(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "<h1&.

Python调用Java_行走在风中的博客-程序员宅基地

安装 python -m pip install jpype1pythonIDEpython3.6 java1.8 eclipse4.6.3 PyDev(python在eclipse插件) (不得不说,eclipse很强大)HelloWord设置参数启动Java虚拟机运行Java代码关闭虚拟机#coding=utf=8import jpypej...