HiKariCP是数据库连接池的一个后起之秀。号称性能最好。能够完美地PK掉其它连接池。


为何要使用HiKariCP?这要先从BoneCP说起:

什么?不是有C3P0/DBCP这些成熟的数据库连接池吗?一直用的好好的。为什么又搞出一个BoneCP来?由于。传说中BoneCP在高速这个特点上做到了极致,官方数据是C3P0等的25倍左右。不相信?事实上我也不怎么信。但是。有图有真相啊(图片来自BoneCP官网:http://jolbox.com/benchmarks.html):

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

并且。网上对于BoneCP是好评如潮啊,推荐的文章一搜一大堆。

然而,上Maven Repository站点(http://mvnrepository.com/artifact/com.jolbox/bonecp)查找有没有最新版本号的时候。你会发现最新的是2013年10月份的(这么久没新版本号出来了?)。

于是。再去BoneCP的Githut(https://github.com/wwadge/bonecp)上看看近期有没有提交代码。却发现。BoneCP的作者对于这个项目貌似已经心灰意冷,说是要让步给HikariCP了(有图有真相):

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

……什么?又来一个CP?……什么是Hikari?
Hikari来自日文。是“光”(阳光的光,不是光秃秃的光)的意思。作者预计是为了借助这个词来暗示这个CP速度飞快。

不知作者是不是日本人,只是日本也有非常多优秀的码农,听说比特币据说日本人搞出来的。

。。


这个产品的口号是“高速、简单、可靠”。实际情况跟这个口号真的匹配吗?又是有图有真相(Benchmarks又来了):

这个图,也间接地、再一次地证明了boneCP比c3p0强大非常多。当然。跟“光”比起来,又弱了不少啊。

那么,这么好的P是怎么做到的呢?官网具体地说明了HikariCP所做的一些优化,总结例如以下:
  • 字节码精简:优化代码,直到编译后的字节码最少,这样,CPU缓存能够载入很多其它的程序代码。
  • 优化代理和拦截器:降低代码,比如HikariCP的Statement proxy仅仅有100行代码,仅仅有BoneCP的十分之中的一个;
  • 自己定义数组类型(FastStatementList)取代ArrayList:避免每次get()调用都要进行range check,避免调用remove()时的从头到尾的扫描;
  • 自己定义集合类型(ConcurrentBag):提高并发读写的效率;
  • 其它针对BoneCP缺陷的优化,比方对于耗时超过一个CPU时间片的方法调用的研究(但没说详细怎么优化)。
非常多优化的对照都是针对BoneCP的……哈哈。

几个连接池的代码量对照(代码量越少。一般意味着运行效率越高、发生bug的可能性越低):

但是,“黄婆卖瓜,自催自擂”这个俗语日本人也是懂得,于是。用户的好评如潮也是有图有真相:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">


还有第三方关于速度的測试:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">


或许你会说,速度高。假设不稳定也是硬伤啊。于是,关于稳定性的图也来了:


另外,关于可靠性方面,也是有实验和数据支持的。对于数据库连接中断的情况。通过測试getConnection(),各种CP的不同样处理方法例如以下:
(全部CP都配置了跟connectionTimeout类似的參数为5秒钟)
HikariCP:等待5秒钟后,假设连接还是没有恢复。则抛出一个SQLExceptions 异常。兴许的getConnection()也是一样处理;
C3P0:全然没有反应。没有提示,也不会在“CheckoutTimeout”配置的时长超时后有不论什么通知给调用者;然后等待2分钟后最终醒来了,返回一个error;
Tomcat:返回一个connection。然后……调用者假设利用这个无效的connection运行SQL语句……结果可想而知。大约55秒之后最终醒来了,这时候的getConnection()最终能够返回一个error,但没有等待參数配置的5秒钟,而是马上返回error;
BoneCP:跟Tomcat的处理方法一样。也是大约55秒之后才醒来,有了正常的反应,而且最终会等待5秒钟之后返回error了;

可见,HikariCP的处理方式是最合理的。

依据这个測试结果,对于各个CP处理数据库中断的情况,评分例如以下:





说得这么好。用起来会不会非常麻烦啊。会不会有非常多參数要配置才干有这种效果啊?答案是:不会。

假设之前用的是BoneCP配置的数据源,那么,就简单了。仅仅须要把dataSource换一下。略微调整一下參数即可了:

BoneCP的数据源配置:
 <!-- BoneCp Datasource -->
<bean id="dataSourceBoneCp" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
<property name="driverClass" value="${db.driverClass}" />
<property name="jdbcUrl" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
<property name="idleConnectionTestPeriodInMinutes" value="2" />
<property name="idleMaxAgeInMinutes" value="2" />
<property name="maxConnectionsPerPartition" value="2" />
<property name="minConnectionsPerPartition" value="0" />
<property name="partitionCount" value="2" />
<property name="acquireIncrement" value="1" />
<property name="statementsCacheSize" value="100" />
<property name="lazyInit" value="true"/>
<property name="maxConnectionAgeInSeconds" value="20"/>
<property name="defaultReadOnly" value="true"/>
</bean>
HiKariCP的数据源配置:
 <!-- Hikari Datasource -->
<bean id="dataSourceHikari" class="com.zaxxer.hikari.HikariDataSource" destroy-method="shutdown">
<!-- <property name="driverClassName" value="${db.driverClass}" /> --> <!-- 无需指定,除非系统无法自己主动识别 -->
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
<!-- 连接仅仅读数据库时配置为true。 保证安全 -->
<property name="readOnly" value="false" />
<!-- 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException。 缺省:30秒 -->
<property name="connectionTimeout" value="30000" />
<!-- 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟 -->
<property name="idleTimeout" value="600000" />
<!-- 一个连接的生命时长(毫秒),超时并且没被使用则被释放(retired),缺省:30分钟。建议设置比数据库超时时长少30秒,參考MySQL wait_timeout參数(show variables like '%timeout%';) -->
<property name="maxLifetime" value="1800000" />
<!-- 连接池中同意的最大连接数。 缺省值:10;推荐的公式:((core_count * 2) + effective_spindle_count) -->
<property name="maximumPoolSize" value="15" />
</bean>
当中,非常多配置都使用缺省值即可了,除了maxLifetime和maximumPoolSize要注意自己计算一下。
其它的配置(sqlSessionFactory、MyBatis MapperScannerConfigurer、transactionManager等)统统不用变。

其它关于Datasource配置參数的建议:
Configure your HikariCP idleTimeout and maxLifeTime settings
to be one minute less than the wait_timeout of MySQL.
对于有Java连接池的系统,建议MySQL的wait_timeout使用缺省的8小时(http://www.rackspace.com/knowledge_center/article/how-to-change-the-mysql-timeout-on-a-server)。

另外:对于web项目,记得要配置:destroy-method="shutdown"

(原创文章,转载请注明转自Clement-Xu的csdn博客:http://blog.csdn.net/clementad/article/details/46928621

为什么HikariCP被号称为性能最好的Java数据库连接池,怎样配置使用的更多相关文章

  1. [转帖]为什么HikariCP被号称为性能最好的Java数据库连接池,如何配置使用

    为什么HikariCP被号称为性能最好的Java数据库连接池,如何配置使用 原创Clement-Xu 发布于2015-07-17 15:53:14 阅读数 57066  收藏 展开 HiKariCP是 ...

  2. 为什么HikariCP被号称为性能最好的Java数据库连接池,如何配置使用

    转自:https://blog.csdn.net/clementad/article/details/46928621 HiKariCP是数据库连接池的一个后起之秀,号称性能最好,可以完美地PK掉其他 ...

  3. JAVA数据库连接池的革命 -- 从BoneCP到HikariCP

    从BoneCP到HikariCP 今天笔者本想更新一下项目中使用到的BoneCP版本的.却无意发现jolbox网站打不开了.起初以为是被墙掉了,经过一番查找,居然在BoneCP的Github站看到了如 ...

  4. JAVA数据库连接池的革命 -- 从BoneCP到HikariCP(转)

    从BoneCP到HikariCP 今天笔者本想更新一下项目中使用到的BoneCP版本的.却无意发现jolbox网站打不开了.起初以为是被墙掉了,经过一番查找,居然在BoneCP的Github站看到了如 ...

  5. java数据库连接池性能对比

    这个测试的目的是验证当前常用数据库连接池的性能. testcase Connection conn = dataSource.getConnection(); PreparedStatement st ...

  6. HikariCP配置使用spring结合--Java数据库连接池

    我的个人德州扑克项目https://github.com/mingzijian/pokers,欢迎给星星.maven引入: Java 8 maven artifact: <dependency& ...

  7. 主流数据库连接池性能比较 hikari druid c3p0 dbcp jdbc

    背景 对现有的数据库连接池做调研对比,综合性能,可靠性,稳定性,扩展性等因素选出推荐出最优的数据库连接池 . NOTE: 本文所有测试均是MySQL库 测试结论 1:性能方面 hikariCP> ...

  8. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析

    作为后台服务开发,在日常工作中我们天天都在跟数据库打交道,一直在进行各种CRUD操作,都会使用到数据库连接池.按照发展历程,业界知名的数据库连接池有以下几种:c3p0.DBCP.Tomcat JDBC ...

  9. Spring Boot 数据库连接池 HikariCP

    简介 HikariCP 来源于日语,「光」的意思,意味着它很快!可靠的数据源,spring boot2.0 已经将 HikariCP 做为了默认的数据源链接池. 官网详细地说明了HikariCP所做的 ...

随机推荐

  1. Jquery+css实现图片无缝滚动轮播

    Today,在XX学院的教学视频中,偶尔看到了Jquery+css实现图片无缝滚动轮播视频教程,虽然以前已写过类似的,但是我感觉他学的比较精简.为了方便以后做项目时直接拷贝,特地写出来,顺便和大家分享 ...

  2. CSS3 背景

    CSS3包含多个新的背景属性,他们提供了对背景更强大的控制. 本章将学到一下背景属性: background-size background-origin 你也将学到如何使用多重背景图片. 浏览器支持 ...

  3. sql server语句

    一.基础1.说明:创建数据库CREATE DATABASE 数据库名2.说明:删除数据库drop database 数据库名3.说明:备份sql server--- 创建 备份数据的 deviceUS ...

  4. Core Data 学习简单整理01

    Core Data是苹果针对Mac和iOS平台开发的一个框架, 通过CoreData可以在本地生成数据库sqlite,提供了ORM的功能,将对象和数据模型相互转换 . 通过Core Data管理和操作 ...

  5. php中bindValue的批量提交sql语句

    php预编译sql语句,可以批量提交sql,也可以实现防注入 <?php $dsn='mysql:host=127.0.0.1;port=3306;dbname=bisai'; $usernam ...

  6. ON DUPLICATE KEY UPDATE 当记录不存在时插入,当记录存在时更新

    MySQL 当记录不存在时插入,当记录存在时更新网上基本有三种解决方法.第一种:示例一:插入多条记录假设有一个主键为 client_id 的 clients 表,可以使用下面的语句:INSERTINT ...

  7. 28 Corn表达式详解 (转自http://blog.csdn.net/claram/article/details/51785193)

    Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: Seconds Minutes Hours DayofMonth Month ...

  8. mongo学习整理

    mongo做为NOSQL家族中一员,被广泛使用以及应用到生产环境中,有其出色的性能.关系型数据库(RDBMS )在互联网中依然是不可替代的一部分,mongo基于NOSQL的特性,在程序中RDBMS不适 ...

  9. apache2.2 虚拟主机配置详解

    一.修改httpd.conf 打开appserv的安装目录,找到httpd.conf文件,分别去掉下面两行文字前面的#号. #LoadModule vhost_alias_module modules ...

  10. 一个读取C#特性Description方法

    class Program { static void Main(string[] args) { string str= DB.write.ToDescription(); Console.Writ ...