一种防止内存溢出的数据查询方法、装置、设备和介质制造方法及图纸

技术编号:37164576 阅读:14 留言:0更新日期:2023-04-20 22:37
本发明专利技术提供一种防止内存溢出的数据查询方法、装置、设备和介质,方法包括:当业务程序迭代查询结果集的过程中,累计当前的迭代次数i,当i达到内存计算的起始阀值n时,开始计算查询结果集的当前总内存大小M

【技术实现步骤摘要】
一种防止内存溢出的数据查询方法、装置、设备和介质


[0001]本专利技术涉及计算机
,特别涉及一种大数据量的数据查询方法、装置、设备和介质。

技术介绍

[0002]在Java语言开发的业务系统中,一般会使用一些ORM(关系对象映射,用于将数据库的一条表记录映射为一个Java实体对象或者Map对象)持久层框架来操作底层数据库,而ORM框架一般是将数据库表记录映射为Java的一个实体对象或者Map对象。业务开发过程中,经常会因为开发人员不规范的查询操作,将整个数据库的大量数据映射到JVM虚拟机堆内存中,从而导致JVM(Java运行的虚拟机)内存溢出。场景举例:将数据库中数据处理后导出成Excel文件,如果需要导出的数据量很大,那么一次性加载到内存中,将可能导致内存溢出。而且这个问题往往不能及时解决,原因是在测试环境里面数据量不大,导致无法发现问题,但是一旦到了正式环境中就会因为数据量大才会导致内存溢出。
[0003]所谓的内存溢出是指:在Java程序中,通常会通过指定JVM参数来限制Java进程的最大堆内存时候,当内存使用超过最大的堆内存值,则JVM内存会出现溢出,导致整个程序无法使用。
[0004]如图1所示,目前的数据查询流程如下:
[0005]S1、业务程序调用具体数据库产商提供的jdbc驱动执行Jdbc查询,jdbc驱动查询数据库返回ResultSet查询结果集(ResultSet中包含了指向数据库具体数据的游标);
[0006]S2、业务程序迭代ResultSet查询结果集,每次迭代会取出数据表中的一行数据记录;
[0007]S3、每一次迭代,业务程序会将查询ResultSet查询结果集的一条数据记录映射为Java实体对象,并将Java实体对象加入到集合列表中;
[0008]S4、业务程序将Java实体对象加入到列表集合中;
[0009]S5、判断是否为本次查询的最后一条数据记录,如果不是最后一条数据记录,则进行下一次迭代,如果是最后一条数据记录,则结束流程。

技术实现思路

[0010]本专利技术要解决的技术问题,在于提供一种防止内存溢出的数据查询方法、装置、设备和介质,在数据查询流程中,通过内存使用限制阈值限制迭代查询结果集的总体次数,从而达到有效防止内存溢出的效果。
[0011]第一方面,本专利技术提供了一种防止内存溢出的数据查询方法,当业务程序迭代查询结果集的过程中,累计当前的迭代次数i,当i达到内存计算的起始阀值n时,开始计算查询结果集的当前总内存大小M
i
,并与单次Jdbc查询内存使用限制阈值M
d
的大小进行比较,当M
i
≥M
d
时,则结束查询,其中M
d
≤M
max
,M
max
为JVM最大内存使用限制阈值。
[0012]第二方面,本专利技术提供了一种防止内存溢出的数据查询装置,当业务程序迭代查
询结果集的过程中,累计当前的迭代次数i,当i达到内存计算的起始阀值n时,开始计算查询结果集的当前总内存大小M
i
,并与单次Jdbc查询内存使用限制阈值M
d
的大小进行比较,当M
i
≥M
d
时,则结束查询,其中M
d
≤M
max
,M
max
为JVM最大内存使用限制阈值。
[0013]第三方面,本专利技术提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现第一方面所述的方法。
[0014]第四方面,本专利技术提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现第一方面所述的方法。
[0015]本专利技术实施例中提供的一个或多个技术方案,至少具有如下技术效果或优点:在数据查询流程中,当迭代次数达到内存计算的起始阀值时,每迭代一次都进行列表集合的当前总内存大小,并与内存使用限制阈值进行比较,进而限制迭代的总体次数在合理的范围内,达到防止内存溢出的效果。而且为了避免因高频次的内存计算产生大量的性能消耗,还通过增加内存计算的起始阀值n来控制何时内存计算的启动时机,避免小数据量查询时影响性能。
[0016]上述说明仅是本专利技术技术方案的概述,为了能够更清楚了解本专利技术的技术手段,而可依照说明书的内容予以实施,并且为了让本专利技术的上述和其它目的、特征和优点能够更明显易懂,以下特举本专利技术的具体实施方式。
附图说明
[0017]下面参照附图结合实施例对本专利技术作进一步的说明。
[0018]图1为现有数据查询方法的框架示意图;
[0019]图2为本专利技术实施例一中方法中的流程图;
[0020]图3为本专利技术实施例的具体流程图;
[0021]图4为本专利技术实施例计算查询结果集当前总内存大小的流程图。
具体实施方式
[0022]本申请实施例通过提供一种防止内存溢出的数据查询方法、装置、设备和介质,在数据查询流程中,通过内存使用限制阈值限制迭代查询结果集的总体次数,从而达到有效防止内存溢出的效果。
[0023]本申请实施例中的技术方案,总体思路如下:当业务程序迭代查询结果集的过程中,累计当前的迭代次数,当迭代次数达到内存计算的起始阀值时,开始计算查询结果集的当前总内存大小,并与单次Jdbc查询内存使用限制阈值的大小进行比较,若查询结果集的当前总内存大小大于或等于单次Jdbc查询内存使用限制阈值的大小时,则结束查询,从而限制迭代查询结果集的总体次数在合理的范围内,达到有效防止内存溢出的效果。另外为了避免因高频次的内存计算产生大量的性能消耗,还通过增加内存计算的起始阀值n来控制何时内存计算的启动时机,从而避免小数据量的查询时影响性能。
[0024]实施例一
[0025]本实施例提供一种防止内存溢出的数据查询方法,当业务程序迭代查询结果集的过程中,累计当前的迭代次数i,当i达到内存计算的起始阀值n时,开始计算查询结果集的当前总内存大小M
i
,并与单次Jdbc查询内存使用限制阈值M
d
的大小进行比较,当M
i
≥M
d
时,
则结束查询。
[0026]其中M
d
≤M
max
,M
max
为JVM最大内存使用限制阈值(即JVM启动时候的

Xmx参数配置JVM程序最大使用内存),比如JVM最大使用内存限制阈值M
max
为4G,那么可以限制单次Jdbc查询内存使用限制阀值M
d
不应该超过4G。
[0027]如图2所示,具体包括下述步骤:
[0028]S1、在业务程序对查询结果集的迭代流程中,每迭代一次时,判断当前迭代次数i是否大于或等于内存计算的起始阀值n,若是,进入步本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种防止内存溢出的数据查询方法,其特征在于:当业务程序迭代查询结果集的过程中,累计当前的迭代次数i,当i达到内存计算的起始阀值n时,开始计算查询结果集的当前总内存大小M
i
,并与单次Jdbc查询内存使用限制阈值M
d
的大小进行比较,当M
i
≥M
d
时,则结束查询,其中M
d
≤M
max
,M
max
为JVM最大内存使用限制阈值。2.根据权利要求1所述的方法,其特征在于:具体包括下述步骤:S1、在业务程序对查询结果集的迭代流程中,每迭代一次时,判断当前迭代次数i是否大于或等于内存计算的起始阀值n,若是,进入步骤S2,若否,则进入步骤S3;S2、计算该查询结果集的当前总内存大小M
i
,并判断当前总内存大小M
i
是否大于单次Jdbc查询内存使用限制阈值M
d
,若M
i
≥M
d
时,则结束查询,若否,则进入步骤S3;S3、判断当前数据记录是否为最后一条数据记录,若是,则结束查询,若否,继续迭代流程,回到步骤S1。3.根据权利要求1所述的方法,其特征在于:所述步骤S2中,判断计算当前总内存大小M
i
是否为首次计算,若是,则一次计算出查询结果集的所有java对象占用的总内存大小,若否,只需计算出本次迭代的java对象占用的内存大小,并累加到上一次总内存大小的计算结果中。4.根据权利要求1所述的方法,其特征在于:所述当前总内存大小M
i
的计算过程如下:(1)获得当前运行环境情况信息以及java对象在堆内存中的存储格式,所述当前运行环境情况信息包括JVM运行环境、CPU架构、运行参数、是否开启指针压缩和JDK版本;(2)根据所述当前运行环境情况信息和所述java对象在堆内存中的存储格式计算Java对象头的大小m1、实例数据的大小m2以及计算引用的栈地址的大小m3;(3)相加得到对象的内存使用,即M
i
=m1+m2+m3;如果有引用了其他对象,则递归计算引用对象的栈地址里面保存的堆地址大小m4,最后累加计算出完整的内存占用大小,即M
i
=m1+m2+m3+m4。5.一种防止内存溢出的数据查询装置,其特征在于:当业务程序迭代查询结果集的过程中,累计当前的迭代次数i,当i达到内存计算的起始阀值n时,开始计算查询结果集的当前总内存大小M
i
,并与单...

【专利技术属性】
技术研发人员:刘平
申请(专利权)人:摩尔元数福建科技有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1