摘自【工匠小猪猪的技术世界】 1.这是一个系列,有兴趣的朋友可以持续关注 2.如果你有HikariCP使用上的问题,可以给我留言,我们一起沟通讨论 3.希望大家可以提供我一些案例,我也希望可以支持你们做一些调优

概念

evict定义在com.zaxxer.hikari.pool.PoolEntry中,evict的汉语意思是驱逐、逐出,用来标记连接池中的连接不可用。

getConnection

在每次getConnection的时候,borrow连接(PoolEntry)的时候,如果是标记evict的,则会关闭连接,更新timeout的值,重新循环继续获取连接

如下我们聚焦一下源码,hardTimeout默认值是30000,这个值实际上就是connectionTimeout,构造器默认值是SECONDS.toMillis(30) = 30000,默认配置validate之后的值是30000,validate重置以后是如果小于250毫秒,则被重置回30秒。

connectionTimeout  This property controls the maximum number of milliseconds that a client (that's you) will wait for a connection from the pool. If this time is exceeded without a connection becoming available, a SQLException will be thrown. Lowest acceptable connection timeout is 250 ms. Default: 30000 (30 seconds)

关闭连接这块的源码如下,从注释可以看到(阅读hikari源码强烈建议看注释),这是永久关闭真实(底层)连接(吃掉任何异常):

吃掉体现在quietlyCloseConnection,这是吃掉Throwable的

createPoolEntry

这段代码强烈建议看一下注释,maxLifetime默认是1800000=30分钟,就是让每个连接的最大存活时间错开一点,防止同时过期,加一点点随机因素,防止一件事情大量同时发生(C大语录)。

如果maxLifetime大于10000就是大于10秒钟,就走这个策略,用maxLifetime的2.5%的时间和0之间的随机数来随机设定一个variance,在maxLifetime - variance之后触发evict。 在创建poolEntry的时候,注册一个延时任务,在连接存活将要到达maxLifetime之前触发evit,用来防止出现大面积的connection因maxLifetime同一时刻失效。 标记为evict只是表示连接池中的该连接不可用,但还在连接池当中,还会被borrow出来,只是getConnection的时候判断了,如果是isMarkedEvicted,则会从连接池中移除该连接,然后close掉。

evict Related

evictConnection

可以主动调用evictConnection,这里也是判断是不是用户自己调用的或者从connectionBag中标记不可borrow成功,则关闭连接

softEvictConnection

com.zaxxer.hikari.util.ConcurrentBag

softEvictConnections

HikariPool中还提供了HikariPoolMXBean的softEvictConnections实现,实际上是调用softEvictConnection,owner指定false( not owner )

Mbean的softEvictConnections方法真正执行的是com.zaxxer.hikari.pool.HikariPool中softEvictConnections方法,这是一种“软”驱逐池中连接的方法,如果调用方是owner身份,或者连接处于空闲状态,可以立即关闭连接。否则,我们将其“标记”为驱逐,以便下次有人试图从池中获取它时将其逐出。

softEvictConnection

执行此方法时我们的owner默认传false(not owner),调用com.zaxxer.hikari.util.ConcurrentBag的reserve对方进行保留

除了 HikariPoolMXBean的调用,softEvictConnections在housekeeper中也有使用

聚焦一下,这段代码也是检测时钟回拨,如果时钟在规定范围外回拨了,就驱除连接,并重置时间。

说到时钟回拨,是不是想起了snowflake里的时钟回拨的处理?让我们一起温习一下!

ConcurrentBag中通过borrow方法进行数据资源借用,通过requite方法进行资源回收,注意其中borrow方法只提供对象引用,不移除对象,因此使用时通过borrow取出的对象必须通过requite方法进行放回,否则容易导致内存泄露!

上述代码中的 weakThreadLocals 是用来判断是否使用弱引用,通过下述方法初始化:

Hikari物理连接取用生命周期

上面提到了很多概念,比如HikariDataSource、HikariPool、ConcurrentBag、ProxyFactory、PoolEntry等等,那么这里的关系是什么呢?

HikariCP中的连接取用流程如下:

HikariPool负责对资源连接进行管理,而ConcurrentBag则是作为物理连接的共享资源站,PoolEntry则是对物理连接的1-1封装。

PoolEntry通过connectionBag的borrow方法从bag中取出,,之后通过PoolEntry.createProxyConnection调用工厂类生成HikariProxyConnection返回。

参考资料

java中时钟回拨,【追光者系列】HikariCP源码分析之evict、时钟回拨、连接创建生命周期...相关推荐

  1. Java中ConcurrentHashMap底层实现原理(JDK1.8)源码分析2

    https://blog.csdn.net/programmer_at/article/details/79715177 https://blog.csdn.net/qq_41737716/categ ...

  2. Java面试绕不开的问题: Java中HashMap底层实现原理(JDK1.8)源码分析

    这几天学习了HashMap的底层实现,但是发现好几个版本的,代码不一,而且看了Android包的HashMap和JDK中的HashMap的也不是一样,原来他们没有指定JDK版本,很多文章都是旧版本JD ...

  3. Java集合Collection源码系列-ArrayList源码分析

    Java集合系列-ArrayList源码分析 文章目录 Java集合系列-ArrayList源码分析 前言 一.为什么想去分析ArrayList源码? 二.源码分析 1.宏观上分析List 2.方法汇 ...

  4. Redis在Java中的使用及连接数据库(附源码)

    Redis在Java中的使用及连接数据库(附源码) 引言: 本文主要分享了Redis如何在IDEA中部署,运行:模拟加入Redis的操作: 文章目录 Redis在Java中的使用及连接数据库(附源码) ...

  5. 十一、HikariCP 源码分析之 HouseKeeper

    源代码版本 2.4.5-SNAPSHOT HouseKeeper 是一个HikariPool的内部类,它实现了Runnable接口,也就是一个线程任务.这个任务是由ScheduledThreadPoo ...

  6. Java并发编程笔记之 CountDownLatch闭锁的源码分析

    转 自: Java并发编程笔记之 CountDownLatch闭锁的源码分析 ​ JUC 中倒数计数器 CountDownLatch 的使用与原理分析,当需要等待多个线程执行完毕后在做一件事情时候 C ...

  7. react中context到底是如何传递的-源码分析

    react中使用context 基本要求就是 父组件中声明Parent.prototype.getChildContext 父组件中声明Parent.childContextType 子组件声明 Ch ...

  8. Java Review - SimpleDateFormat线程不安全原因的源码分析及解决办法

    文章目录 概述 复现问题 源码分析 How to Fix ? 每次使用时new一个SimpleDateFormat的实例 加锁 使用ThreadLocal 换API - JodaTime or JDK ...

  9. [NIO系列]NIO源码分析之Buffer

    在以前的一篇文章中我们介绍过IO模型 IO模型总结 http://www.cnblogs.com/coldridgeValley/p/5449758.html ,而在实际运用中多路复用IO使用很多,J ...

  10. java使用websocket,并且获取HttpSession,源码分析

    一:本文使用范围 此文不仅仅局限于spring boot,普通的spring工程,甚至是servlet工程,都是一样的,只不过配置一些监听器的方法不同而已. 本文经过作者实践,确认完美运行. 二:Sp ...

最新文章

  1. 处理js事件时,获取键盘数字注意
  2. 安装 SQL Server 2008 R2 的硬件和软件要求(转)
  3. spring boot filter配置方式
  4. loading怎么关闭 vant_vant-ui组件调用Dialog弹窗异步关闭操作
  5. 一步步编写操作系统 15 CPU与外设通信——IO接口,下
  6. python语言原理_梯度下降算法的原理用Python语言实现,易于理解,python,更
  7. 2019 sample-free(样本不平衡)目标检测论文阅读笔记
  8. 探究光栅图像学之水纹渲染与折射滤镜
  9. MIT6.830 lab5 B+ Tree Index 实验报告
  10. 怎么样辨别穷人跟有钱人?
  11. Nginx 服务器安装及配置文件详解
  12. 内网穿透,将内网地址映射为外网地址
  13. mist linux安装位置,Mist(以太坊浏览器)
  14. uni-app 输入框类型
  15. haproxy+rabbitmq镜像集群
  16. halcon学习拓展系列—弱边缘缺陷检测方法汇总之频域方法(一)
  17. Ubuntu拔掉挂载硬盘后一直卡在ubuntu的logo处以及windows强制关机会出现ubuntu出现系统恢复模式
  18. 用vscode调试远程服务器的php
  19. Exynos_4412——IIC总线概述
  20. 学好C语言,你只需要这几句口诀!

热门文章

  1. es7新特性随堂笔记
  2. 使用metasploit制作钓鱼网站——browser autopwn攻击
  3. 12、添加和删除页码符号
  4. 【macOS免费软件推荐】第8期:IINA+
  5. 快速、准确使用EndNote插入参考文献
  6. C罗是你人生中最好的健身教练和精神导师
  7. 搜狗微信公众号文章反爬虫完美攻克
  8. 【Arduino】基础传感器使用
  9. 我给浏览器加了个语音搜索功能
  10. 服务器外接显卡不显示,RE: power edge T620按照第二块显卡,不能正常工作,操作系统中查看驱动程序安装正常,工作正常,外接显示器无独立信号...