Java中驗證 Mybatis 數(shù)據(jù)分片可以減輕GC壓力的操作方法
前言
- 本文使用 Spock(可集成Spring Boot項目) 編寫測試用例,基于 Groovy (JVM語言)
- 用例的目標(biāo)為 Mybatis 的查詢api
- 用例數(shù)據(jù)量10W 行
- 用例倉庫地址
1. 配置用例堆內(nèi)存大小
-Xmx100m,配置堆內(nèi)存大小,讓溢出情況更快出現(xiàn)
2. 單次全量查造成 GC overhead limit exceeded
“GC overhead limit exceeded”是Java虛擬機(jī)(JVM)在運行時拋出的一個錯誤消息,它指示JVM花費了太多時間進(jìn)行垃圾回收(GC),但回收的堆內(nèi)存卻很少
以下用例的意思是,期待拋出異常,并打印異常信息。
3. 分片查詢減輕GC壓力
使用 Guava 的工具分片查詢同一批數(shù)據(jù),異常消失。
4. Spock 語法積累
4.1 測試用例的鉤子函數(shù)
- Spock 相關(guān)的鉤子函數(shù)造數(shù)
- setup 方法——用例執(zhí)行前調(diào)用cleanup 方法——用例執(zhí)行后調(diào)用
@SpringBootTest(classes = KetchupApplication.class) class GcSpec extends Specification { @Resource FileOutputRecordMapper mapper /** * 十萬條數(shù)據(jù)庫查詢 */ Long startId = 1; Long endId = 100000; /** * 生成十萬條數(shù)據(jù),測試用例執(zhí)行完后刪除 */ 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 數(shù)據(jù)結(jié)構(gòu) rang 聲明
def rang = (startId .. endId)
普通的 list 聲明 ()
def list = [1,2,3]
rang 轉(zhuǎn) list
// 生成一個list,內(nèi)部的元素是從1 到 100000的數(shù)值類型 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>
后記
大數(shù)據(jù)量的查詢時,避免用一個大List<>裝大量數(shù)據(jù),必要時將數(shù)據(jù)分片,減輕GC壓力。
大數(shù)據(jù)的不同任務(wù),盡量串行化執(zhí)行,避免出現(xiàn)GC毛刺。
到此這篇關(guān)于Java中驗證 Mybatis 數(shù)據(jù)分片可以減輕GC壓力的文章就介紹到這了,更多相關(guān) Mybatis 數(shù)據(jù)分片減輕GC壓力內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot結(jié)合JDBC實現(xiàn)雙數(shù)據(jù)源實例
這篇文章主要為大家介紹了Springboot結(jié)合JDBC實現(xiàn)雙數(shù)據(jù)源實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12老生常談Java中instanceof關(guān)鍵字的理解
java 中的instanceof 運算符是用來在運行時指出對象是否是特定類的一個實例。這篇文章主要介紹了老生常談Java中instanceof關(guān)鍵字的理解,需要的朋友可以參考下2018-10-10基于JVM 調(diào)優(yōu)的技巧總結(jié)分析
本篇文章是對JVM 調(diào)優(yōu)的技巧進(jìn)行了總結(jié)和分析。需要的朋友參考下2013-05-05Java并發(fā)之條件阻塞Condition的應(yīng)用代碼示例
這篇文章主要介紹了Java并發(fā)之條件阻塞Condition的應(yīng)用代碼示例,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-02-02SpringBoot集成Redis及SpringCache緩存管理示例詳解
本文介紹了如何在SpringBoot中集成Redis并使用SpringCache進(jìn)行緩存管理,詳解了Redis的配置、使用以及SpringCache的注解,還闡述了SpringCache的工作原理,包括其AOP實現(xiàn)和與各種緩存框架的集成,使得開發(fā)者可以輕松實現(xiàn)緩存功能,以提高應(yīng)用性能2024-09-09