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毛刺。
到此这篇关于Java中验证 Mybatis 数据分片可以减轻GC压力的文章就介绍到这了,更多相关 Mybatis 数据分片减轻GC压力内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringBoot启动类@SpringBootApplication注解背后的秘密
这篇文章主要介绍了SpringBoot启动类@SpringBootApplication注解背后的秘密,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-12-12Spring中的@CrossOrigin注册处理方法源码解析
这篇文章主要介绍了Spring中的@CrossOrigin注册处理方法源码解析,@CrossOrigin是基于@RequestMapping,@RequestMapping注释方法扫描注册的起点是equestMappingHandlerMapping.afterPropertiesSet(),需要的朋友可以参考下2023-12-12SpringCloud hystrix断路器与局部降级全面介绍
什么是服务降级?当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作2022-10-10Spring中获取Bean对象的三种注入方式与两种注入方法详解
平常的Java开发中程序员在某个类中需要依赖其它类的方法,下面这篇文章主要给大家介绍了关于Spring中获取Bean对象的三种注入方式与两种注入方法的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下2023-03-03Spring定时任务关于@EnableScheduling的用法解析
这篇文章主要介绍了Spring定时任务关于@EnableScheduling的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-06-06
最新评论