hiricacp 连接池校验机制

news/2024/9/18 13:33:41/ 标签: 服务器, 数据库, 前端

一、背景

项目发生告警,但是并没有影响业务,看了下日志,红框里面有循环调用了3次 ,一直以为是外部的重试在重试,但是外部确没有重试记录,就深扒了代码

 二、想法

我知道hikaricp获取连接之后会校验连接的有效性,就猜想如果校验失败了,那本次请求是不是就是失败了,如果这样的话,那就没校验的意义了,所以肯定有重试机制用以保证请求的完整性。

三、实践

HikariDataSource.class

@Overridepublic Connection getConnection() throws SQLException{if (isClosed()) {throw new SQLException("HikariDataSource " + this + " has been closed.");}if (fastPathPool != null) {return fastPathPool.getConnection();}// See http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_JavaHikariPool result = pool;if (result == null) {synchronized (this) {result = pool;if (result == null) {validate();LOGGER.info("{} - Starting...", getPoolName());try {pool = result = new HikariPool(this);this.seal();}catch (PoolInitializationException pie) {if (pie.getCause() instanceof SQLException) {throw (SQLException) pie.getCause();}else {throw pie;}}LOGGER.info("{} - Start completed.", getPoolName());}}}return result.getConnection();}
这里面调用了   result.getConnection();  result为hikariPool
HikariPool.class
public Connection getConnection() throws SQLException
{return getConnection(connectionTimeout);
}public Connection getConnection(final long hardTimeout) throws SQLException{suspendResumeLock.acquire();final long startTime = currentTime();try {long timeout = hardTimeout;do {PoolEntry poolEntry = connectionBag.borrow(timeout, MILLISECONDS);if (poolEntry == null) {break; // We timed out... break and throw exception}final long now = currentTime();if (poolEntry.isMarkedEvicted() || (elapsedMillis(poolEntry.lastAccessed, now) > aliveBypassWindowMs && !isConnectionAlive(poolEntry.connection))) {closeConnection(poolEntry, poolEntry.isMarkedEvicted() ? EVICTED_CONNECTION_MESSAGE : DEAD_CONNECTION_MESSAGE);// elapsedMillis 方法是将当前时间戳-startTime 得出的时间差timeout = hardTimeout - elapsedMillis(startTime);}else {metricsTracker.recordBorrowStats(poolEntry, startTime);return poolEntry.createProxyConnection(leakTaskFactory.schedule(poolEntry), now);}} while (timeout > 0L);metricsTracker.recordBorrowTimeoutStats(startTime);throw createTimeoutException(startTime);}catch (InterruptedException e) {Thread.currentThread().interrupt();throw new SQLException(poolName + " - Interrupted during connection acquisition", e);}finally {suspendResumeLock.release();}}

方法整体流程

  1. 获取锁:确保线程安全。
  2. 记录开始时间:用于后续计算超时和统计。
  3. 尝试获取连接
    • 在给定的超时时间内循环尝试获取连接。   

      elapsedMillis 方法是将当前时间戳-startTime 得出的时间差

    • 如连接无效则关闭连接并继续尝试。
    • 如连接有效则记录统计信息并返回连接。
  4. 超时处理:如在规定时间内未能成功获取连接,记录超时统计信息并抛出 SQLException
  5. 异常处理:捕获 InterruptedException 并抛出相应的 SQLException
  6. 释放锁:确保锁被释放,即使在异常情况下

http://www.ppmy.cn/news/1524164.html

相关文章

一文读懂在线学习凸优化技术

一文读懂在线学习凸优化技术 在当今的数据驱动时代,机器学习算法已成为解决复杂问题的关键工具。在线学习凸优化作为机器学习中的一项核心技术,不仅在理论研究上具有重要意义,还在实际应用中展现出巨大的潜力。本文将深入浅出地介绍在线学习…

【CanMV K230 AI视觉】 人体检测

【CanMV K230 AI视觉】 人体检测 人体检测 动态测试效果可以去下面网站自己看。 B站视频链接:已做成合集 抖音链接:已做成合集 人体检测 人体检测是判断摄像头画面中有无出现人体,常用于人体数量检测,人流量监控以及安防监控等。…

Windows下使用MinGW编译安装zmq的步骤

背景: 在开发过程中,需要使用zmq库进行数据交互,因此需要编译zmq库。 安装步骤 软件下载 https://github.com/zeromq/libzmq.git 下载,将代码切换到git checkout 4c6cff6391分支 软件编译 cd .\libzmq\ mkdir build cd .\bu…

数学基础 -- 线性代数之矩阵的迹

矩阵的迹 什么是矩阵的迹? 矩阵的迹(Trace of a Matrix)是线性代数中的一个基本概念,定义为一个方阵主对角线上元素的总和。矩阵的迹在许多数学和物理应用中都起着重要作用,例如在矩阵分析、量子力学、统计学和系统理…

通过卷积神经网络(CNN)识别和预测手写数字

一:卷积神经网络(CNN)和手写数字识别MNIST数据集的介绍 卷积神经网络(Convolutional Neural Networks,简称CNN)是一种深度学习模型,它在图像和视频识别、分类和分割任务中表现出色。CNN通过模仿…

2024.9.10 作业

做一个闹钟 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent> #include <QTimer> #include <QTime> #include <QTimerEvent> #include<QTextToSpeech> //文本转语音类QT_BEGIN_NAMESPACE name…

Kotlin 代替Java接口回调,就这么简单

假如你使用旧的接口回调&#xff1a; 通常三步&#xff1a;1 定义接口和方法&#xff1b;2 使用接口中方法&#xff1b;3 继承接口并实现方法&#xff1b; 例&#xff1a; class XXXAdapter{public var mClickCollBack: clickCollBack? null //1定义interface clickColl…

规范化的GB/T28181逐渐成为行业“新宠”

GB/T28181发展史 GB/T 28181&#xff0c;全称为《安全防范视频监控联网系统信息传输、交换、控制技术要求》&#xff0c;是我国音视频领域的一项关键标准。在发展过程中不断完善和升级&#xff0c;以适应安防行业的需求和发展趋势。 1. GB/T 28181-2011版本 发布时间&#x…

本地内存和分布式缓存(面试)

本地缓存和分布式缓存 本地缓存&#xff1a;缓存组件和应用在同一进程中。但各应用都需要维护单独的缓存&#xff0c;无法共享缓存。 分布式缓存&#xff1a;缓存组件和应用分离&#xff0c;不在同一进程&#xff0c;多个应用可直接共享缓存。 本地缓存的实现 缓存一般是一种…

将小写字母转换为大写字母(c 语言)

2.我们第一步输入字符串&#xff0c;第二步进行筛选将字符串中所以下标为奇数位置上的字母转换成大写&#xff0c;如果该位置不是字母&#xff0c;则不转换。 #include <stdio.h> #include <string.h> void fun( char *ss ) {int i 0;while (*ss ! \0){if (i % 2…

机器学习算法-决策树算法

文章目录 什么是决策树&#xff1f;决策树的基本概念决策树的构建过程决策树的优缺点优点&#xff1a;缺点&#xff1a; 决策树的优化决策树的应用决策树的实现工具 特征选择准则1. 信息增益&#xff08;Information Gain&#xff09;计算公式&#xff1a;熵&#xff08;Entrop…

SprinBoot+Vue教务管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

MySQL原理之UUID主键分析,插入或更新语法分析

文章目录 1 MySQL不能用UUID做主键1.1 前言1.2 mysql和程序实例1.2.1 准备工作1.2.2 开始测试1.2.3 程序写入结果1.2.4 效率测试结果 1.3 使用uuid和自增id的索引结构对比1.3.1 自增id1.3.2 uuid 1.4 自增id缺点1.5 雪花算法 2 插入或更新2.1 on duplicate key2.1.1 定义2.1.2 …

计算机网络练级第一级————认识网络

目录 网络搁哪&#xff1f; 网络的发展史&#xff08;了解&#xff09; 独立模式&#xff1a; 网络互联&#xff1a; 局域网时期&#xff1a; 广域网时期&#xff1a; 什么是协议 TCP/IP五层/四层模型 用官话来说&#xff1a; 我自己的话来说 第一层应用层&#xff1…

LLM大模型学习:NLP三大特征抽取器(CNN/RNN/TF)

NLP三大特征抽取器&#xff08;CNN/RNN/TF&#xff09; 结论&#xff1a;RNN已经基本完成它的历史使命&#xff0c;将来会逐步退出历史舞台&#xff1b;CNN如果改造得当&#xff0c;将来还是有希望有自己在NLP领域的一席之地&#xff1b;而Transformer明显会很快成为NLP里担当…

Redis 篇-深入了解基于 Redis 实现消息队列(比较基于 List 实现消息队列、基于 PubSub 发布订阅模型之间的区别)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 消息队列的认识 2.0 基于 List 实现消息队列 2.1 基于 List 实现消息队列的优缺点 3.0 基于 PubSub 实现消息队列 3.1 基于 PubSub 的消息队列优缺点 4.0 基于 St…

DC 板 boot 测 nor 兼容性记录(qspi )

DC 板 boot 测 nor 兼容性记录&#xff08;qspi &#xff09; 软件问题&#xff1a; 1、DC板在跑 qspi时&#xff0c;在跑ddr 初始化部分需要修改以下参数&#xff0c;否则会在fsbl stage1 或者 stage 3 出错。 Board配置选 ad101_v10&#xff1b; 2、由于socket与DC板接触可能…

超详细,手把手带你源码启动 Thingsboard-Gateway + MQTT 接入设备

超详细&#xff0c;手把手带你源码启动 Thingsboard-Gateway MQTT 接入设备 前置条件 thingsboard&#xff0c;我这里选择的是本地源码启动postgresql&#xff0c;这里采用的是个人服务器部署的公共服务EMQX&#xff0c;这里同样采用服务器部署的公共服务MQTTX 客户端Mysql【…

《JavaScript:前端开发的核心力量》

在当今的数字时代&#xff0c;JavaScript 无疑是前端开发中最重要的编程语言之一。它的强大功能和灵活性使得网页变得更加动态、交互性更强。本文将深入探讨 JavaScript 的各个方面&#xff0c;包括其历史、特点、基本语法、高级特性以及实际应用。 一、JavaScript 的历史 Java…

MDK编译过程、文件及_attribute__关键字

一.MDK编译过程及文件说明 1.MDK 的编译过程 2.编译结果说明 在工程的编译提示输出信息中有一个语句“Program Size&#xff1a;Codexx RO-dataxx RW-dataxx ZIdataxx”&#xff0c;它说明了程序各个域的大小&#xff0c;编译后&#xff0c;应用程序中所有具有同一性质的数据…