首页 > 数据库 >Kingbase+sqlsugar 携手助力医疗国产化替换 【人大金仓 .NET ORM】

Kingbase+sqlsugar 携手助力医疗国产化替换 【人大金仓 .NET ORM】

时间:2024-05-10 15:15:57浏览次数:27  
标签:金仓 1.2 连接数 Idle ORM Kingbase 连接 连接池

 

1. 案例

成某三甲医预约系统, 该项目在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的一些基础,在进一步使用中您会发现,

SqlSugar和人大金仓优点:

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

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

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

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

标签:金仓,1.2,连接数,Idle,ORM,Kingbase,连接,连接池
From: https://www.cnblogs.com/sunkaixuan/p/18184377

相关文章

  • post请求下载文件,"Content-Type": "application/x-www-form-urlencoded",
    importaxiosfrom"axios";importqsfrom"qs";if(item.resourceName=="导出"){const[startTime="",endTime=""]=this.rangeTime||[];letparams={carNumber:this.carNu......
  • pony:简洁易用的 ORM 库
    PythonPonyORM是一个功能强大且易于使用的ORM库,它提供了简洁的语法和强大的功能,使得开发者能够更轻松地进行数据库操作。PythonPonyORM的主要特点包括:简单易用:PythonPonyORM提供了简单易懂的语法,使得开发者可以快速上手并进行数据库操作。强大的查询功能:PythonPon......
  • 盘点10个.Net比较流行的开源的ORM框架
    https://gitee.com/BookerLiu/GeekDesk编程乐趣2022-09-10对于我们而言选择ORM框架的目的,其实都是为了让我们的程序更好的操作数据库,提高开发编程效率和程序的维护拓展性。所以我们选择ORM需要从项目实际业务出发,选择最合适自己团队的框架。下面推荐10个主流比较流行的ORM框架,都......
  • Lossless Recompression of JPEG Images Using Transform Domain Intra Prediction
    目录简介引入文章贡献对DCT系数残差进行编码比对原始DCT系数进行编码更有利于压缩模型框架简介\(\quad\)JPEG图像编码格式由于其简单高效在各种设备和网站上被广泛使用,但JPEG与性能与最先进的编码方法相差甚远。如果能对这些JPEG图像再压缩,将会缩减储存成本。该文章提出了......
  • antd在form中一个select设置另一个select
    需求:所属网络(select)变化的时候,对应空投合约(select)也跟着变化。 constonChainChange=(chainId:any)=>{setCurrChainId(chainId)constcurrOptions=extraObj.airdropContractFormOptions.map((item:any)=>{if(item.network_id===chainId){......
  • C#winform实现通过点击Button来切换不同的界面
    C#winform实现通过点击Button来切换不同的界面实现目标:点击左边菜单栏里面的Button实现右边区域切换不同界面。步骤:1.界面布局由于实现目标需要用到容器控件,所以需要选择合适的容器控件来进行左右区域布局。常用的容器控件有:Panel,FlowLayoutPanel,GroupBox,TabControl,SplitConta......
  • [Paper Reading] OFT Orthographic Feature Transform for Monocular 3D Object Detec
    OFTOrthographicFeatureTransformforMonocular3DObjectDetectionOFTOrthographicFeatureTransformforMonocular3DObjectDetection时间:18.11机构:UniversityofCambridgeTL;DR当时纯视觉自动驾驶方案效果上仅达到Lidar方案有10%的水平,本文claim部分差距源于pe......
  • 信息动力学:InformationDynamics+HIID+社会传播学
    信息动力学:InformationDynamics人智交互设计:Human-IntelligenceInteractionDesign社会传播学:SocialMedia.清华新研究解密信息茧房!全新信息动力学理论,登Nature子刊https://new.qq.com/rain/a/20231024A097GC00三种信息动力学:如何识别元胞自动机中的涌现?https://swarma.org......
  • 用WinForm实现进度条显示
    整体UIbackgroundwork事件它用于在单独的后台线程上执行耗时的操作,而不阻塞UI线程创建backgroundwork//------------------------backgroundworker_Dowork事件------------------------//------------------------(objectsender,EventArgse)具体表......
  • WinForm下实现子窗体
    如果想要实现在同一个Form下的子窗体切换,下面的方法可以实现。窗体设计,如图增加子窗体。鼠标右键项目,选择添加,选择用户控件注意修改用户控件的大小尺寸,和GroupBox的尺寸匹配。建立好子窗体后,在主Form里面先声明各个子窗体类,如下://定义用户窗口变量......