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

embedded/2024/11/29 11:30:03/

文章目录

    • 前言
    • 1. 配置用例堆内存大小
    • 2. 单次全量查造成 GC overhead limit exceeded
    • 3. 分片查询减轻GC压力
    • 4. Spock 语法积累
      • 4.1 测试用例的钩子函数
      • 4.2 given when then expect 的用法
    • 5. Groovy 语法积累
      • 5.1 Rang 数据结构
      • 5.2 List.collect
    • 6. Guava 工具类积累
    • 后记

前言

  • 本文使用 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 {@ResourceFileOutputRecordMapper 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 工具类积累

java">Lists.partition(allIds, 1000).forEach...

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

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

后记

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


http://www.ppmy.cn/embedded/141448.html

相关文章

springboot 整合 rabbitMQ (延迟队列)

前言&#xff1a; 延迟队列是一个内部有序的数据结构&#xff0c;其主要功能体现在其延时特性上。这种队列存储的元素都设定了特定的处理时间&#xff0c;意味着它们需要在规定的时间点或者延迟之后才能被取出并进行相应的处理。简而言之&#xff0c;延时队列被设计用于存放那…

探索天空中的“名字”——用Landsat影像记录你的名字形状!

大家好&#xff01;今天我发现了一个特别有趣的工具——NASA官网上有一个功能&#xff0c;允许你输入自己的名字&#xff0c;然后它会根据Landsat卫星影像显示出与你名字形状相符的地形图。是不是很酷&#xff1f;&#x1f389; &#x1f30d; Landsat影像的神奇之处Landsat是N…

语言模型中的多模态链式推理

神经网络的公式推导 简介摘要引言多模态思维链推理的挑战多模态CoT框架多模态CoT模型架构细节编码模块融合模块解码模块 实验结果运行代码补充细节安装包下载Flan-T5数据集准备rougenltkall-MiniLM-L6-v2运行 简介 本文主要对2023一篇论文《Multimodal Chain-of-Thought Reason…

Java接收LocalDateTime、LocalDatee参数

文章目录 引言I java服务端的实现1.1 基于注解规范日期格式1.2 json序列化和反序列化全局配置自动处理日期格式化II 知识扩展: 枚举的转换和序列化III 签名注意事项引言 应用场景举例:根据时间段进行分页查询数据 前后端交互日期字符串统一是yyyy-MM-dd HH:mm:ss 或者yyyy-M…

大模型开发中LCEL与LLMChain响应度的对比

管道连接 import timefrom langchain_community.chat_models import ChatOpenAI from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import PromptTemplatet1 time.time() llm ChatOpenAI( )resp_prompt_path response_prompt.md pr…

【Leetcode 每日一题】235. 二叉搜索树的最近公共祖先

235. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&…

如何在Solana链上开发Dapp?RPC节点的要求

在 Solana 链上开发 DApp 是一个系统性过程 1. 理解 Solana 和其开发模型 Solana 是高性能区块链&#xff0c;采用 Rust 语言开发智能合约&#xff08;称为 Program&#xff09;。开发 DApp 需要掌握以下核心概念&#xff1a; • 账户模型&#xff1a;Solana 使用账户存储数…

Ubuntu 服务器部署 Tomcat 并配置 SSL/TLS 证书

本文目录 准备登陆云服务器安装 Java下载 tomcat 包配置防火墙浏览器访问 Tomcat 默认页面以服务的形式运行 Tomcat创建 Tomcat 用户和组创建 systemd 服务文件启动 tomcat 服务 Tomcat webapps 文件目录部署一个静态网站tomcat 的配置文件 将域名解析到服务器Tomcat 配置 SSL/…