代码编织梦想

HiKariCP连接池

什么是HikariCP:
HiKariCP是由日本程序员(美国人)开源的一个数据库连接池组件,代码非常轻量,并且速度非常快。根据官方提供的数据,在i7开启32个线程,32个连接的情况下,进行随机数据库读写操作,HiKariCP的速度是现在常用的C3P0数据库连接池的数百倍。在SpringBoot2.0中,官方也是推荐使用HiKariCP连接池。

为什么HiKariCP这么好:
官网详细地说明了HiKariCP所作地优化,总结如下:
字节码精确:优化代码,知道编译后地字节码最少,这样,CPU缓存可以加载更多地程序代码。
优化代理和拦截器:减少代码,例如HiKariCP地Statement proxy只有100代码,只有BoneCP的十分之一。
自定义数据类型(FastStatementList)代替ArrayList:避免每次get()调用都要进行range check,避免调用remove()时的从头到尾扫描。
其他针对Bone缺陷的优化:比如对于耗时超过一个CPU时间片的方法调用优化(但没说具体怎么优化)。
参考文章:https://github.com/brettwooldridge/HikariCP/wiki/Down-the-Rabbit-Hole

为什么HiKariCP这么快:
主要是由以下几点:
1、代码量:
几个连接池代码量相比对比(代码量越少,一般意味着执行效率越高、发生bug的可能性越低):
在这里插入图片描述

2、口碑:
“黄婆卖瓜,自催自擂”这个俗语日本人也是懂得,于是,用户的好评如潮也是有图有真相:
在这里插入图片描述

3、速度
还有第三方关于速度的测试:
在这里插入图片描述
也有会说速度高,如果不稳定也是硬伤。于是,关于稳定性的图也来了:
在这里插入图片描述

另外,关于可靠性方面,也是有实验和数据支持的。对于数据库连接中断的情况,通过测试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处理数据库中断的情况,评分如下:
在这里插入图片描述

参考文章:https://github.com/brettwooldridge/HikariCP/wiki/Bad-Behavior:-Handling-Database-Down

说得这么好,用起来会不会很麻烦啊,会不会有很多参数要配置才能有这样的效果啊?答案是:不会。
如果之前用的是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>

     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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>

     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

其中,很多配置都使用缺省值就行了,除了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创建数据源demo-爱代码爱编程

HiKariCP是数据库连接池的一个后起之秀,号称性能最好,可以完美地PK掉其他连接池。 官网:https://github.com/brettwooldridge/HikariCP Maven 仓库: <dep

hikaricp的数据源配置:-爱代码爱编程

<!-- Hikari Datasource --> <bean id="dataSourceHikari" class="com.zaxxer.hikari.HikariDataSource" destroy-method="shutdown"> <!-- <property name="driverClas

druid和hikaricp_jcxq的博客-爱代码爱编程_druid与hikaricp

今天为了优化springmvc中的数据连接池,就去查了下一些数据连接池的性能。结果如下: 1:性能方面 hikariCP>druid>tomcat-jdbc>dbcp>c3p0 。hikariCP的

【追光者系列】hikaricp连接池监控指标实战_芋道源码的博客-爱代码爱编程

1.这是一个系列,有兴趣的朋友可以持续关注2.如果你有HikariCP使用上的问题,可以给我留言,我们一起沟通讨论3.希望大家可以提供我一些案例,我也希望可以支持你们做一些调优 业务方关注哪些数据库指标? 首先分享一下自己之前的一段笔记(找不到引用出处了) 系统中多少个线程在进行与数据库有关的工作?其中,而多少个线程正在执

mybatis 外接 hikaricp 连接池 (无spring)_elyacc的博客-爱代码爱编程_hikaricp mybatis

尝试MyBatis连接HikariCP连接池, 资料基本都来自于 MyBatis官网手册以及 HikariCP Github页面的readme.md教学文件 笔者用的是MySql数据库, 首先根据hikariCP的要求,

hikaricp连接池问题-爱代码爱编程

HiKari源于日语“光”的意思,HiKariCP顾名思义就是 和光速一样快,HiKariCP是数据库连接池的一个后起之秀,号称性能最好,稳定性也不错,完美地PK掉其他连接池。这里提供一篇文章介绍主流Java数据库连接池比较及前瞻,文中重点介绍了当前主流开源数据库连接池(比如C3P0、DBCP、Tomcat Jdbc Pool、Druid和Hikaricp

hikaricp和druid对比使用整理自测_anonysuperziy的博客-爱代码爱编程_hikari和durid

HiKariCP和Druid 我们所熟知的C3P0,DBCP,Druid, HiKariCP为我们所常用的数据库连接池, 其中C3P0已经很久没有更新了。DBCP更新速度很慢,基本处于不活跃状态,而Druid和HikariCP处于活跃状态的更新中,这就是我们说的二代产品了。   HiKariCP 字节码精简 :优化代码,直到编译后的字节码最少,这

数据库连接池hikaricp源码分析_时间道的博客-爱代码爱编程

hikaricp总结:借助哪些技术使性能超越其他线程池的? 为了性能,自定义数据结构:FastList、ConcurrentBag 主要就是ConcurrentBag使用threadLocal、shareList、等待queue 对获取connnection做了优化。 定时器相关的使用:scheduleWithFixedDelay(Runnable

HikariCP 了解一下-爱代码爱编程

作者 | 黄永灿 后端开发攻城狮,关注服务端技术与性能优化。 前言 在我们的工作中,免不了要和数据库打交道,而要想和数据库打好交道,选择一款合适的数据库连接池就至关重要,目前业界广为人知的数据库连接池有 Tomcat JDBC Connection Pool、c3p0、DBCP、BoneCP、Druid 等,而我们这次要介绍的主角是 HiK

hikaricp和mysql驱动_【数据库连接池】HIkariCP的简单学习-爱代码爱编程

今天简单的了解了一下HikariCP的原理, 记录了一下在HikariCP的github地址中学习到的东西。只是一个简单的了解,并没有深入的研究。 之所以去了解HikariCP是因为SpringBoot默认使用的是HikariCP数据库连接池,想简单的了解一下为什么SpringBoot会使用它,而不是其他的数据库连接池。 HikariCP数据源简

hikaricp 连接池分析_SpringBoot 2.0 中 HikariCP 数据库连接池原理解析-爱代码爱编程

作为后台服务开发,在日常工作中我们天天都在跟数据库打交道,一直在进行各种CRUD操作,都会使用到数据库连接池。按照发展历程,业界知名的数据库连接池有以下几种:c3p0、DBCP、Tomcat JDBC Connection Pool、Druid 等,不过最近最火的是 HiKariCP。 HiKariCP 号称是业界跑得最快的数据库连接池,自从 Spr

hikaricp mysql_HikariCP-爱代码爱编程

软件简介 HikariCP 是一个高性能的 JDBC 连接池组件。下图是性能的比较测试结果: 使用方法: HikariConfig config = new HikariConfig(); config.setMaximumPoolSize(100); config.setDataSourceClassName("com.mysql.jd