Java中验证 Mybatis 数据分片可以减轻GC压力的操作方法

 更新时间:2024年12月05日 11:34:18   作者:Ch.yang  
这篇文章主要介绍了Java中验证 Mybatis 数据分片可以减轻GC压力的操作方法,本文使用 Spock(可集成Spring Boot项目) 编写测试用例,基于 Groovy (JVM语言),感兴趣的朋友跟随小编一起看看吧

前言

  • 本文使用 Spock(可集成Spring Boot项目) 编写测试用例,基于 Groovy (JVM语言)
  • 用例的目标为 Mybatis 的查询api
  • 用例数据量10W 行
  • 用例仓库地址

1. 配置用例堆内存大小

-Xmx100m,配置堆内存大小,让溢出情况更快出现

2. 单次全量查造成 GC overhead limit exceeded

“GC overhead limit exceeded”是Java虚拟机(JVM)在运行时抛出的一个错误消息,它指示JVM花费了太多时间进行垃圾回收(GC),但回收的堆内存却很少
以下用例的意思是,期待抛出异常,并打印异常信息。

3. 分片查询减轻GC压力

使用 Guava 的工具分片查询同一批数据,异常消失。

4. Spock 语法积累

4.1 测试用例的钩子函数

  • Spock 相关的钩子函数造数
  • setup 方法——用例执行前调用cleanup 方法——用例执行后调用
@SpringBootTest(classes = KetchupApplication.class)
class GcSpec extends Specification {
    @Resource
    FileOutputRecordMapper mapper
	/**
     * 十万条数据库查询
     */
    Long startId = 1;
    Long endId = 100000;	
    /**
     * 生成十万条数据,测试用例执行完后删除
     */
    def setup() {
        def allIds = (startId..endId).toList()
        Lists.partition(allIds, 1000).forEach { subIds ->
            def sub = subIds.collect(it -> createPO(it))
            mapper.batchInsertWithId(sub);
        }
    }
    def cleanup() {
        mapper.deleteByIdRang(startId, endId)
    }
}

4.2 given when then expect 的用法

以下是已知的三种用例写法

    def "分片查询" () {
    	given:
        when:
        then:
    }
    def "分片查询" () {
        when:
        then:
    }
    def "分片查询" () {
    	given:
        expect:
    }

5. Groovy 语法积累

5.1 Rang 数据结构 rang 声明

def rang = (startId .. endId)

普通的 list 声明 ()

def list = [1,2,3]

rang 转 list

// 生成一个list,内部的元素是从1 到 100000的数值类型
def allIds = (1 .. 100000).toList()

5.2 List.collect

// 以下的 collect 写法比Java简洁很多
def sub = subIds.collect(it -> createPO(it))
// 等价于 Java 的写法
List<FileOutputRecordPO> poList = subIds.stream().map(it -> createPO(it)).collect(Collectors.toList())

6. Guava 工具类积累

Lists.partition(allIds, 1000).forEach...

本文的集合分片工具来自:

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>30.1-jre</version>
        </dependency>

后记

大数据量的查询时,避免用一个大List<>装大量数据,必要时将数据分片,减轻GC压力。
大数据的不同任务,尽量串行化执行,避免出现GC毛刺。

到此这篇关于Java中验证 Mybatis 数据分片可以减轻GC压力的文章就介绍到这了,更多相关 Mybatis 数据分片减轻GC压力内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot中Elasticsearch的连接配置原理与使用详解

    Spring Boot中Elasticsearch的连接配置原理与使用详解

    在Spring Boot中,我们可以通过Elasticsearch实现对数据的搜索和分析,本文将介绍Spring Boot中Elasticsearch的连接配置、原理和使用方法,感兴趣的可以了解一下
    2023-09-09
  • mybatis的Configuration详解

    mybatis的Configuration详解

    这篇文章主要介绍了mybatis的Configuration详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • SpringBoot2 整合Nacos组件及环境搭建和入门案例解析

    SpringBoot2 整合Nacos组件及环境搭建和入门案例解析

    这篇文章主要介绍了SpringBoot2 整合Nacos组件,环境搭建和入门案例详解,在整合springboot2时注意版本 0.2.x.RELEASE 对应的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 对应的是 Spring Boot 1.x 版本,具体内容详情跟随小编一起看看吧
    2022-03-03
  • Hadoop源码分析五hdfs架构原理剖析

    Hadoop源码分析五hdfs架构原理剖析

    本篇是Hadoop源码分析系列文章第五篇,主要介绍Hadoop的hdfs架构原理剖析,后续本系列文章会持续更新,有需要的朋友可以借鉴参考下
    2021-09-09
  • Java中输出字符的ASCII值实例

    Java中输出字符的ASCII值实例

    这篇文章主要介绍了Java中输出字符的ASCII值实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • JavaFX中处理Spring的异常的方法

    JavaFX中处理Spring的异常的方法

    JavaFX运行在JavaFX应用线程(JavaFX Application Thread)上,而Spring通常运行在独立的线程中,本文给大家介绍JavaFX中处理Spring的异常的方法,感兴趣的朋友跟随小编一起看看吧
    2025-10-10
  • Java响应式编程之handle用法解析

    Java响应式编程之handle用法解析

    这篇文章主要介绍了Java响应式编程之handle用法解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • 详解Spring如何避免被JVM 垃圾回收

    详解Spring如何避免被JVM 垃圾回收

    如果Spring 被回收掉,Spring管理的bean全部会被回收,那我们的Java应用不就被一锅端了吗?所以本文小编将和大家一起聊聊Spring如何避免被JVM垃圾回收,需要的朋友可以参考下
    2023-11-11
  • Spring MVC @RequestParam注解使用场景分析

    Spring MVC @RequestParam注解使用场景分析

    @RequestParam是Spring MVC中用于绑定HTTP查询参数和表单数据的注解,支持类型转换、默认值及可选参数,适用于简单数据场景,本文给大家介绍Spring MVC @RequestParam注解使用场景分析,感兴趣的朋友一起看看吧
    2025-07-07
  • Sleuth+logback 设置traceid 及自定义信息方式

    Sleuth+logback 设置traceid 及自定义信息方式

    这篇文章主要介绍了Sleuth+logback 设置traceid 及自定义信息方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07

最新评论