1. 案例

西京医院CT预约系统, 该项目在2024年初进行上线测试,在正常运行了两天后,业务系统报错:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (currently 15 seconds)。金仓开发人员跟进分析,具体排查步骤如下:

1.1 是否是高并发导致的问题

首先是对业务系统进行了梳理,用户业务系统图如下:

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

1.2 查询服务器端的连接数

金仓数据库系统表:sys_stat_activity中,记录了每个连接的信息,可以通过如下的语句来查询具体业务的连接数:

select state,query from pg_stat_activity where application_name=‘ksql’;

通过加入定时命令,每隔1秒钟都会查询一下对应业务开启的数据库连接数。在业务量最大时,查询到的连接数达到了800个。并且大多数连接的状态为:Idle in transcation,意味着有大量连接开启了事务,但没有任何操作。是因为连接数池上限过小的问题吗?继续将连接池的上限修改,修改为所允许的最大值。结果连接数依旧可以达到连接上限1200。上述现象不符合驱动kdbndp连接池的循环使用机制。这里需要介绍一下金仓驱动kdbndp的连接池机制:

1.2.1 Kdbndp连接池-连接池状态

连接池有三个计数器:

Idle:空闲连接计数器

Busy:正在使用连接计数器

Waiting:等待获取连接对象计数器

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

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

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

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

1.2.6 连接池满-处理流程

1.2.7 连接池参数介绍

Pooling:

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

Minimum Pool Size

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

Maximum Pool Size

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

Connection Idle Lifetime

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

Connection Pruning Interval

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

从连接池设计的机制来看,一般连接使用结束之后,是释放回到连接池中;而现场问题中存在大量创建物理连接,将连接池撑爆的现象存在。而且大量物理连接的状态为:Idle in transcation,至此,我们找到了导致连接池爆池的原因。

1.3 分析Idle in transcation

Idle in transcation:当数据连接处于“Idle in transcation”状态时,意味着连接已经开启了事物,但没有任何操作(如提交或回滚)来结束这个事务。我们将KingbaseES+sugar框架的结构图梳理出来,进一步的定位问题,结果图如下:

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

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

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

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

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

上述流程中,步骤二中,创建单例模式的访问对象,这个引起了sugar开发人员和金仓开发人员的关注。在SqlSugar创建单例模式时,整个的创建使用流程如下:

在创建单实例模式中,开始了事务,在使用结束之后,需要提交事务,使用commit接口CommitTran(),提交事务,释放Kdbndp连接对象;如果只是将sqlsugar单实例的对象释放,不使用提交事务接口完成释放的话,KdbndpConnection连接不会被释放,这样就导致了数据库中连接处于:Idle in transcation的现象;再次调用创建单实例模式对象,采用同样的流程,连接数开始逐渐的累加起来,直到出现爆池的错误。

分析之后,梳理用户的业务代码,果然是在开启事物之后,调用完成退出时没有做commit操作,导致Kdbndp连接无法回到连接池,无法循环使用连接池中连接而导致爆池。

调整业务代码,在释放sqlsugar单实例对象时,做事务提交退出操作。修改之后,连接池中的物理连接保持在20个左右,不再出现爆池的错误。循环使用连接池的连接,导致服务器端相关资源消耗下降至原来的1/60。每次任务的提交速度提升了200ms。

现场问题解决了,此过程中,了解了kingbase+sugar的一些基础,在进一步使用中您会发现,他们还具有其他的优点:

1、 功能更新的及时性,因为两家公司深入合作,彼此产品有新功能的退出,能在第一时间互相沟通,及时发布;

2、 屏蔽差异化,采用该方案,可以在金仓的多个模式(pg、oracle、mysql)上开发,不用关注模式会带来额外的配置;

3、 开发的高效性,采用ORM框架,缩短了开发周期,屏蔽了差异化,业务迁移和开发的成本都会降低;

4、 实时的技术支持,以在多个项目中得到验证,双方的高效合作,为用户的定制开发、问题定位提供及时的技术支持。

Kingbase+sqlsugar 携手助力医疗国产化替换 【人大金仓 .NET ORM】的更多相关文章

  1. 通过ODBC接口访问人大金仓数据库

      国产化软件和国产化芯片的窘境一样,一方面市场已经存在性能优越的同类软件,成本很低,但小众的国产化软件不仅需要高价买入版权,并且软件开发维护成本高:另一方面,国产软件目前普遍难用,性能不稳定,Bug ...

  2. 教你10分钟对接人大金仓EF Core 6.x

    前言 目前.NET Core中据我了解到除了官方的EF Core外,还用的比较多的ORM框架(恕我孤陋寡闻哈,可能还有别的)有FreeSql.SqlSugar(排名不分先后).FreeSql和SqlS ...

  3. DBeaver连接达梦|虚谷|人大金仓等国产数据库

    前言 工作中有些项目可能会接触到「达梦.虚谷.人大金仓」等国产数据库,但通常这些数据库自带的连接工具使用并不方便,所以这篇文章记录一下 DBeaver 连接国产数据库的通用模版,下文以达梦为例(其他国 ...

  4. QT 之 ODBC连接人大金仓数据库

    QT 之 使用 ODBC 驱动连接人大金仓数据库 获取数据库驱动和依赖动态库 此操作可在人大金仓官网下载与系统匹配的接口动态库,或者从架构数据库的源码中获取驱动和依赖动态库 分别为: 驱动动态库:kd ...

  5. 通过jmeter连接人大金仓数据库

    某项目用的人大金仓数据库,做性能测试,需要用jmeter来连接数据库处理一批数据.jmeter连接人大金仓,做个记录. 1. 概要 在"配置元件"中添加"JDBC Con ...

  6. 人大金仓KCI

    #include "bin/libkci.h" static void exit_nicely(KCIConnection *conn) { KCIConnectionDestor ...

  7. NGK公链助力医疗行业数据安全

    近年来医疗领域的数据泄露事件时有发生,医疗行业数据面临着医疗数据获得不易及缺乏有效管理和数据安全机制问题.而区块链的去中心化.分布式账本等特点正好契合医疗领域的需求点. 医疗数据市场痛点 一.医疗信息 ...

  8. 润乾配置连接kingbase(金仓)数据库

     问题背景 客户根据项目的不同,使用润乾连接的数据库类型各种各样,此文针对前几日使用润乾设计器连接kingbase金仓数据库做一个说明. kingbase金仓数据库是一款国产数据库,操作方式和配置 ...

  9. 金仓Kingbase数据库网页数据维护分析工具

    金仓Kingbase是优秀的国产数据库产品,在能源,政务,国防等领域广泛使用, 现在TreeSoft数据库管理系统已支持Kingbase了,直接在浏览器中就可以操作查看Kingbase数据了,十分方便 ...

  10. 数据量不足,MedicalNet 如何助力医疗影像 AI 突破瓶颈?

    ​导读 |近日,云+社区技术沙龙“腾讯开源技术”圆满落幕.本次沙龙邀请了多位腾讯技术专家,深度揭秘了腾讯开源项目TencentOS tiny.TubeMQ.Kona JDK.TARS以及Medical ...

随机推荐

  1. HTTP长连接和短链接代理与网关

    长连接和短链接 代理与网关 HTTP/)服务器端网关:网关与客户端使用HTTP协议通信,使用其他协议与服务端通信 (/HTTP)客户端网关:网关与客户端使用其他协议通信,使用HTTP协议与服务端通信 ...

  2. #二分图,并查集#洛谷 6185 [NOI Online #1 提高组] 序列

    题目 分析 考虑2操作可以在保证总和不变的情况下任意修改, 如果将2操作所在的连通块用并查集缩点,那么再考虑1操作, 按照1操作建边,如果存在奇环,那么只要这个环的点权和为偶数一定能使 \(a,b\) ...

  3. #zkw线段树#洛谷 3792 由乃与大母神原型和偶像崇拜

    题目 给你一个长为 \(n\) 的序列 \(a\) 每次两个操作: 修改 \(x\) 位置的值为 \(y\) 查询区间 \([l,r]\) 是否可以重排为值域上连续的一段 分析 直接维护区间最大值和最 ...

  4. 基于分级安全的OpenHarmony架构设计

      本文转载自 OpenHarmony TSC 官方微信公众号<峰会回顾第1期 | 基于分级安全的OpenHarmony架构设计> 演讲嘉宾 | 付天福 回顾整理 | 廖   涛 排版校对 ...

  5. HDC.Together2023 HarmonyOS学生公开课议程抢先看!

     未来已来,见证相遇 万众瞩目的HarmonyOS学生公开课 于8月6日9:30正式起航 关注HarmonyOS生态前景 聚焦HarmonyOS新技术 畅谈HarmonyOS未来 把握时代发展机遇,让 ...

  6. HTTP 使用指南

    0x1 初识 HTTP 协议 网页加载流程 graph LR A(user 输入网址)==>B(browser 进程) B==>C(处理输入信息) B-->D(页面加载完成) C== ...

  7. sm加密前端解析--JS实现国密算法SM2加密

    https://gitee.com/houxianzhou/sm2-demo.git 具体相关算法这里不在讲述,网上文章很多,也可以看我之前 iOS-sm2-sm3-sm4-sm9-zuc 里面提供的 ...

  8. 什么是token,为什么需要token

    1.为什么需要token 随着互联网的发展,为了更安全,以及更好的用户体验,逐渐产生了token这个技术方案 之所以使用token是因为http/https协议本身是无状态的,不能进行信息的存储 (c ...

  9. Windows代理配合Burp抓取客户端+小程序数据包

    "感谢您阅读本篇博客!如果您觉得本文对您有所帮助或启发,请不吝点赞和分享给更多的朋友.您的支持是我持续创作的动力,也欢迎留言交流,让我们一起探讨技术,共同成长!谢谢!"  在渗透测 ...

  10. HarmonyOS NEXT应用开发之多层嵌套类对象监听

    介绍 本示例介绍使用@Observed装饰器和@ObjectLink装饰器来实现多层嵌套类对象属性变化的监听. 效果图预览 使用说明 加载完成后显示商品列表,点击刷新按钮可以刷新商品图片和价格. 实现 ...