探案录 | KingbaseES+SqlSugar为医疗用户排忧解难

66e8e68733f1ca6b2284ccb1e1c56de9.jpeg

在2024年的初春,某大型三甲医院的CT预约系统上线测试,如同新芽破土,充满了希望与活力。然而,仅仅两天后,一个技术难题如同迷雾中的幽灵,悄然出现:The connection pool has been exhausted……

福尔摩斯K,如同猎犬般敏锐,迅速投入了这场技术探案。

 #第一章:迷雾初现 

“华生,我们必须首先排除高并发的可能性。”福尔摩斯K开始对业务系统进行梳理。

他发现,错误是业务系统报出的,业务系统处理第三方消息平台发送的请求,第三方消息平台收集签到机和其它设备发送的请求。业务系统高峰期时,同时请求的请求可以达到10条左右。并发量并不大,排除并发量导致的连接池爆池。

14847112ee4a7bff9c765676b2d393fc.jpeg

#第二章:数字的线索 

福尔摩斯K转而查询K家族自主研发的KingbaseES系统表sys_stat_activity,记录了每个连接的信息。

他发现,KingbaseES通过精心设计的查询语句,每隔一秒,如同钟表的滴答声,记录下了对应业务的数据库连接数。在业务量最大时,连接数竟达到了800个,大多数连接状态为“Idle in transaction”,如同悬而未决的谜团。

4b7d2ba27dd906baaceb02a3bf8e209f.jpeg

#第三章:连接池的秘密 

之后,福尔摩斯K对KingbaseES驱动的kdbndp连接池机制进行了深入的分析。

在他看来,连接池的三个计数器——空闲连接计数器Idle、正在使用连接计数器Busy和等待获取连接对象计数器Waiting——如同三重奏,共同维持着连接池的和谐。

然而,现场问题中存在大量创建物理连接的现象,将连接池撑爆,这与连接池的设计机制不符,也许这就是破案的关键。

01

连接池中无连接-申请连接流程

0f6edbed086515d46e6ffc0465090b66.png

02

连接池已经存在连接-申请连接流程

eb9fdf6e8dc43abbdd1a50f248de7cd0.png

03

连接池释放连接—应用退出

fadced9c154654541178161c2c9c9f75.png

04

连接池释放连接—连接空闲达到设置时间(默认5分钟)

cda3c0e38794077e8d01005070ef17ca.png

05

连接池满-处理流程

d9eef78a891e613d6c85d52540db3107.png

06

连接池参数介绍

Pooling

是否开启连接池,true:开发连接池,false:关闭连接池,默认值:true

Minimum Pool Size

连接池保持最小连接数,默认值:0

Maximum Pool Size

连接池可以创建连接额最大数,默认值:100

Connection Idle Lifetime

空闲连接空闲时间达到的时间值,到达该时间值时,可以回收该连接,默认值:300(秒)

Connection Pruning Interval

空闲连接回收之前等待时间,默认值:10(秒)

分析后得知,从连接池设计的机制来看,一般连接使用结束之后,是释放回到连接池中;而现场问题中存在大量创建物理连接,将连接池撑爆的现象存在。

大量物理连接的状态为:

Idle in transcation

至此,福尔摩斯K找到了导致连接池爆池的原因。

ca9d301cb82236b61c3bd7510c3ebc02.jpeg

#第四章:事务的幽灵

“华生,我们需要关注这些‘Idle in transaction’的连接。”福尔摩斯K认为,当数据连接处于此状态时,意味着连接已经开启了事务,但没有任何操作来结束这个事务。

他们进一步梳理了KingbaseES+SqlSugar框架的结构图,试图定位问题。

KingbaseES+SqlSugar

6fdd048267e7f46cd6d1a2bc0d6b9ab1.png

e8fd69ec2cd5d964d24554961d07c1c1.png

业务流程访问数据库的数据经过了如下步骤:

1> 定义实体数据模型,实体模型模型是编写程序的依据;

2>业务系统调用SqlSugar接口,创建对象时,业务代码编写人员可以指定使用SqlSugar的模式,推荐使用的是单例模式SqlSugarScope,该模式是线程安全的。在创建对象的时候,通过DbType指定访问的数据库是哪一家的。Kdbndp中有一个参数DbModeType,指定使用哪种数据库模式,两者有异曲同工之妙;这个时候,我们也指定了我们访问的数据库,访问数据库使用的连接参数等信息;

3>还是调用SqlSugar接口,SqlSugar会将对应接口的操作,映射、翻译为对应的sql语句,调用Kdbndp的执行接口,将语句发送到服务器端;

4>服务器端执行之后,执行结果又通过Kdbndp的功能接口,回到SqlSugar,根据映射关系,将结果存放至模型对象中,业务系统通过获取模型对象中的数据,完成业务数据展示的处理流程。

上述流程步骤二中,创建单例模式的访问对象,引起了福尔摩斯K和华生的关注。福尔摩斯K对华生说:“我觉得我们需要梳理一下SqlSugar创建单例模式时,整个的创建使用流程。”

华生立刻给出了流程图:

bd7ec99b835892451981f0a7352fc68f.jpeg

K家族

不一般

2542ad4ea8fb02d4d47394bf8309ab30.gif

ac824eb4e4b21c506654ff6a3e7f7412.png

#第五章:单例模式的陷阱 

在SqlSugar创建单例模式的过程中,福尔摩斯K发现了关键的线索。果然是在开启事物之后,调用完成退出时没有做commit操作,导致Kdbndp连接无法回到连接池,无法循环使用连接池中连接而导致爆池。

26a95849729bef4cc59db43565344336.jpeg

#第六章:迷雾散去 

福尔摩斯k说:“调用BeginTran(),完成业务逻辑退出时,必须调用CommitTran()来完成连接的释放。”用户在完成业务逻辑退出时,调用了CommitTran()。

经过调整,连接池中的物理连接保持在20个左右,爆池的错误不再出现。服务器端相关资源消耗大幅下降,每次任务的提交速度显著提升。这场技术探案,如同解开了一道复杂的密码,终于迎来了曙光。

#第七章:搭子的力量 

案件水落石出后,华生发现了KingbaseES+SqlSugar的方案在实际业务中有不少优点,比如说:

1

屏蔽数据库模式的差异,业务根本不用关心我连接的是金仓的什么数据库模式,因为驱动和框架已经做了屏蔽了差异,让业务编写更容易迁移;

2

业务开发和迁移的高效性,驱动和框架做了兼容开发,只是通过连接串的不同,就能实现不同数据库之间的业务迁移,太方便了;

3

实时的技术支持,可以快速定位问题,并解决问题。

福尔摩斯k点点头,表示认可,并补充到:“你忘了说KingbaseES较为全面的兼容能力,目前兼容了PostgreSQL、Oracle、MySQL、SQL Server等数据库的核心功能。这在业界是极具独创性的。”

这一次

福尔摩斯K更接近K家族的核心技术了

欢迎大家持续关注

揭开K家族的神秘面纱

9c70eb98bd634b8d9ac21843295b95e5.png供稿:产品研发中心、战略市场部

编辑:王堇

审核:日尧

7106ada7d7f0212cdc6ac42d31235de1.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/608642.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5.07 Pneumonia Detection in Chest X-Rays using Neural Networks

肺炎诊断是一个耗时的过程,需要高技能的专业人员分析胸部X光片chest X-ray (CXR),并通过临床病史、生命体征和实验室检查确认诊断。 它可以帮助医生确定肺部感染的程度和位置。呼吸道疾病在 X 光片上表现为一处膨胀的不透明区域。然而,由于不…

STM32 ADC学习

ADC Analog-to-Digital Converter,即模拟/数字转换器 常见ADC类型 分辨率和采样速度相互矛盾,分辨率越高,采样速率越低。 ADC的特性参数 分辨率:表示ADC能辨别的最小模拟量,用二进制位数表示,比如8,10…

OpenAI 正在开发一种可以防止版权诉讼的工具

OpenAI 正在开发一种名为 Media Manager 的工具,该工具将使内容创建者和所有者能够确定他们是否愿意将自己的内容用于 ML 研究和 AI 模型训练。 Media Manager 将做什么? 明年推出的 Media Manager 将使内容创作者和所有者能够更好地控制他们的工作是否…

C语言初阶(6) - 指针

目录 1.指针是什么? 2. 指针和指针类型 2.1 指针 - 整数 2.2 指针的解引用 3. 野指针 3.1 野指针成因 3.2 如何规避野指针 4. 常量指针和指针常量 (const) 4.1.常量指针 4.2.指针常量 5. 指针运算 5.1 指针-整数 5.2 指针-指针 5.3指针的关系运算 6.…

Vitis HLS 学习笔记--理解串流Stream(2)

目录 1. 简介 2. 极简的对比 3. 硬件模块的多次触发 4. 进一步探讨 do-while 5. 总结 1. 简介 在这篇博文中《Vitis HLS 学习笔记--AXI_STREAM_TO_MASTER-CSDN博客》,我分享了关于 AXI Stream 接口的实际应用案例。然而,尽管文章中提供了代码示例&…

如何向Linux内核提交开源补丁?

2021年,我曾经在openEuler社区上看到一项改进Linux内核工具的需求,因此参与过Linux内核社区的开源贡献。贡献开源社区的流程都可以在内核社区文档中找到,但是,单独学习需要一个较长的过程,新手难以入门,因此…

分享四种免费获取SSL的方式

SSL证书目前需要部署安装的网站很多,主要还是基于国内目前对证书的需求度在不断的升高,网站多了、服务器多了之后。网络安全问题就成为了大家不得不面对的一个重要的问题了。SSL证书的作用有很多,这里就不一一详述了,本期作品主要…

如何在线阅读Linux内核源码?

开源社区有一句名言:Talk is cheap, show me your code。阅读源代码是学习Linux操作系统的必经之路。但是,Linux内核的代码量超过3000万行,工程包非常大,直接下载耗时较长,这就需要使用一些在线阅读的技巧。 方式1&am…

【深度学习】【Lora训练0】StabelDiffusion,Lora训练,kohya_ss训练

文章目录 环境数据自动标注kohya_ss BLIP2kohya_ss WD14 后续 资源: (1)训练ui kohya_ss: https://github.com/bmaltais/kohya_ss (2)kohya_ss 的docker 其他docker https://github.com/ashleykleynhans…

韩顺平0基础学Java——第7天

p110-p154 控制结构(第四章) 多分支 if-elseif-else import java.util.Scanner; public class day7{public static void main(String[] args) {Scanner myscanner new Scanner(System.in);System.out.println("input your score?");int s…

Word表格标题间距大修改环绕为无仍无法解决

1.选中表格,右键选择【表格属性】 2.选择【环绕】,此时【定位】可以被启用(如下),点击进入窗口 3.修改参数和下面一模一样 注意:【垂直】那里的修改方式是先选段落,后在位置输入0

【linux】主分区,扩展分区,逻辑分区,动态分区,引导分区,标准分区

目录 主分区,扩展分区,逻辑分区 主分区和引导分区 主分区,扩展分区,逻辑分区(标准分区) 硬盘一般划分为一个“主分区”和“扩展分区”,然后在扩展分区上再分成数个逻辑分区。 磁盘主分区扩展…

html+css-Day1(盒子模型)

一、常用属性 1、字体设置font "line-height" 是 CSS 中的一个属性,用于设置文本行之间的距离,也就是行间距。它影响着段落、行内元素或者任何包含文本的元素的可读性。"line-height" 可以设置为数字、长度单位(如 px、e…

现货黄金流程到何种程度?现货黄金在金融产品中的占比是多少?

踏入2024年以来,受美联储降息以及地缘局势紧张的影响,美元受压,避险情绪高涨,众多因素影响下黄金价格出现了强势的上涨,屡创历史新高。在上涨如此强劲的背景下,投资者希望通过黄金投资来实现资产增值。市场…

力扣爆刷第135天之数组五连刷(双指针快慢指针滑动窗口)

力扣爆刷第135天之数组五连刷(双指针快慢指针滑动窗口) 文章目录 力扣爆刷第135天之数组五连刷(双指针快慢指针滑动窗口)一、704. 二分查找二、27. 移除元素三、977. 有序数组的平方四、209. 长度最小的子数组五、59. 螺旋矩阵 II…

Adversarial Synthesis of Human Pose From Text # 论文阅读

URL https://arxiv.org/pdf/2005.00340 TD;DR 20 年 5 月来自高校的一篇论文,任务是用 GAN 生成 pose,目前 7 引用。 Model & Method 输入的是描述动作的 text,通过 text encoder(本文用的是叫做 fastText 的方法&#…

Kafka应用Demo:指派分区订阅消息消费

环境准备 Kafka环境搭建和生产者样例代码与《Kafka应用Demo:按主题订阅消费消息》相同。 消费者代码样例 public class KafkaConsumerService {private static final Logger LOGGER LoggerFactory.getLogger(KafkaConsumerService.class);private static final S…

word图片水印

一、word中旧水印如何删除 打开word模板,想要删除旧水印,如下图所示操作,但是旧水印删除不掉。 以为上传新水印图片会替换掉旧水印,结果显示了2个水印,要怎么删除呢? 如下截图所示,双击打开页…

vue+element的表格(el-table)排班情况表(2024-05-09)

vueelement的表格&#xff08;el-table&#xff09;排班情况&#xff0c;增删查改等简单功能 代码&#xff1a; <template><!-- 表格 --><div class"sedules"><el-header><el-date-pickerv-model"monthValue2"type"month…

YOLOv8网络结构介绍

将按照YOLOv8目标检测任务、实例分割任务、关键点检测任务以及旋转目标检测任务的顺序来介绍&#xff0c;主要内容也是在目标检测任务中介绍&#xff0c;其他任务也只是Head层不相同。 1.YOLOv8_det网络结构 首先&#xff0c;YOLOv8网络分成了三部分&#xff0c;分别是主干网络…