【Java】验证 Mybatis 数据分片可以减轻GC压力

前言

  • 本文使用 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毛刺。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值