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. 大数据hadoop Linux 相关常用命令行操作

    bin/zkServer.sh start bin/zkServer.sh stop 启动Hadoop 1 hadoop102 sbin/start-dfs.sh 2 hadoop103 sbin/s ...

  2. ET8开发微信小游戏之部署云服务器Nginx代理

    最近用ET8搞微信小游戏测试,部署到云服务器,手机上运行,必须要用https备案过得域名,客户端使用websocket创建必须要wss开头,服务端部分通过Nginx进行https通信之后转发到云服务器 ...

  3. #Kruskal,可撤销并查集#CF891C Envy

    题目 给出一个 \(n\) 个点 \(m\) 条边的无向图,每条边有边权,共 \(Q\) 次询问, 每次给出 \(k_i\) 条边,问这些边能否同时在一棵最小生成树上. 分析 考虑最小生成树选择的边权 ...

  4. #对勾函数#洛谷 5695 [NOI2001]反正切函数的应用

    题目 问给定的每一个\(a\),是否存在正整数\(b,c\), 使得在满足$$\arctan(\frac{1}{a})=\arctan(\frac{1}{b})+\arctan(\frac{1}{c} ...

  5. #二分,哈希 or dp#洛谷 4398 [JSOI2008]Blue Mary的战役地图

    题目 求两个正方形矩阵的最大公共正方形矩阵边长 分析 第一种就是\(dp\): 设\(dp[x1][y1][x2][y2]\)表示第一个正方形矩阵以\((x1,y1)\)为右下角, 第二个正方形矩阵以 ...

  6. OpenHarmony加速行业应用落地,多款软件发行版正通过兼容性测评

    4 月 25 日,OpenAtom OpenHarmony(以下简称"OpenHarmony")技术日在深圳举办,大会聚焦 OpenHarmony 3.1 Release 版本核心 ...

  7. XML文档节点导航与选择指南

    XPath(XML Path Language)是XSLT标准的主要组成部分.它用于在XML文档中浏览元素和属性,提供了一种强大的定位和选择节点的方式. XPath的基本特点 代表XML路径语言: X ...

  8. Qt线程简单使用三:QRunnable~线程池

    需求: 点击QPushButton按钮,QLabel中的数字,不断累加,一直到999.   做法: 创建任务类,点击QPushButton后,将任务类放入线程池中运行,通过任务类while循环,不断发 ...

  9. MogDB/openGauss访问控制简介

    MogDB/openGauss 访问控制简介 SQL 可以针对不同的数据库对象赋予不同的权限,这样就可以限制用户对数据的不必要访问,提高数据访问的安全性.常见的 SQL 权限如下: SELECT/UP ...

  10. Launching Teamviewer remotely through SSH

    Launching Teamviewer remotely through SSH When you need to manage your Server remotely, but you can ...