【技术实现步骤摘要】
一种防止内存溢出的数据查询方法、装置、设备和介质
[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查询结果集 ...
【技术保护点】
【技术特征摘要】
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
,并与单...
【专利技术属性】
技术研发人员:刘平,
申请(专利权)人:摩尔元数福建科技有限公司,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。