欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring?JPA?deleteInBatch導(dǎo)致StackOverflow問題

 更新時間:2024年05月07日 09:01:01   作者:Mr-Wanter  
這篇文章主要介紹了Spring?JPA?deleteInBatch導(dǎo)致StackOverflow問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

數(shù)據(jù)庫日志庫定時清理日志數(shù)據(jù),幾天之后發(fā)現(xiàn),jvm內(nèi)存溢出現(xiàn)象。

一、問題定位

1、日志數(shù)據(jù)量太大(近40w數(shù)據(jù))

2、源碼分析

@Scheduled(cron = "0 0 1 * * ?")
	public void timedPullNewInfo() {
		Date date=new Date();
		Calendar ca=Calendar.getInstance();
		try{
			ca.setTime(date);
			ca.add(ca.DATE, -30);
			Date queryDate = ca.getTime();
			log.info("進(jìn)入定時任務(wù)的方法中來清理前30天的操作日志================");
			List<GempUserOperationLogPO> polist = gempUserOperationLogDao.findByCreateTimeBefore(queryDate);
			gempUserOperationLogDao.deleteInBatch(polist);
		}catch (Exception e){
			log.info("清理前30天的操作日志出錯================"+e.getMessage());
		}
	}

3、問題定位在

gempUserOperationLogDao.deleteInBatch(polist);

二、內(nèi)存溢出原理

jpa封裝的deleteInBatch底層執(zhí)行邏輯為

delete from [table_name] where [criteria] = id or [criteria] = id (and so on...)

HqlSqlBaseWalker需要搜索遍歷所有的where條件語句,當(dāng)數(shù)據(jù)量過大時就會導(dǎo)致內(nèi)存溢出。

三、其他嘗試

1、循環(huán)遍歷刪除delete

List<GempUserOperationLogPO> polist = gempUserOperationLogDao.findByCreateTimeBefore(queryDate);
polist.forEach(x->{
	gempUserOperationLogDao.delete(x);
});

四十萬數(shù)據(jù)等不起…

2、分批次刪除

	//按每1000個一組分割
	private static final Integer MAX_NUMBER = 1000;

	/**
	 * 計算切分次數(shù)
	 */
	private static Integer countStep(Integer size) {
		return (size + MAX_NUMBER - 1) / MAX_NUMBER;
	}

	@Scheduled(cron = "0 0 1 * * ?")
	public void timedPullNewInfo() {
		Date date=new Date();
		Calendar ca=Calendar.getInstance();
		try{
			ca.setTime(date);
			ca.add(ca.DATE, -30);
			Date queryDate = ca.getTime();
			log.info("進(jìn)入定時任務(wù)的方法中來清理前30天的操作日志================");

			List<GempUserOperationLogPO> polist = gempUserOperationLogDao.findByCreateTimeBefore(queryDate);
			int limit = countStep(polist.size());
			List<List<GempUserOperationLogPO>> mglist = new ArrayList<>();
			Stream.iterate(0, n -> n + 1).limit(limit).forEach(i -> {
				mglist.add(polist.stream().skip(i * MAX_NUMBER).limit(MAX_NUMBER).collect(Collectors.toList()));
			});
			mglist.forEach(x->{
				gempUserOperationLogDao.deleteInBatch(x);
			});
		}catch (Exception e){
			log.info("清理前30天的操作日志出錯================"+e.getMessage());
		}
	}

還是等不起…

3、直接全部刪除

gempUserOperationLogDao.deleteAll();

deleteAll()底層執(zhí)行邏輯:

  • 1、查詢所有數(shù)據(jù)
  • 2、根據(jù)id逐一刪除

與方式一沒有區(qū)別,等到天荒地老

四、解決方案

原生sql刪除,秒級方案

public interface GempUserOperationLogDao extends
        JpaRepository<GempUserOperationLogPO, String>, JpaSpecificationExecutor<GempUserOperationLogPO> {
        
    @Transactional
    @Modifying
    @Query(value = "delete from user_operation_log where create_time < ?1", nativeQuery = true)
    int deleteAllLists(Date date);
}

StopWatch sw = new StopWatch();
sw.start("校驗(yàn)耗時");
gempUserOperationLogDao.deleteAllLists(queryDate);
sw.stop();
System.out.println(sw.prettyPrint());
StopWatch '': running time (millis) = 943
ms%Task name
00943100%校驗(yàn)耗時

總結(jié)

面對大數(shù)據(jù)量的數(shù)據(jù)批量修改、刪除操作時,不要使用jpa封裝的方法操作數(shù)據(jù),編寫原生sql效率更高且不易發(fā)生問題。

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mybatis的核心配置文件使用方法

    Mybatis的核心配置文件使用方法

    Mybatis的核心配置文件有兩個,一個是全局配置文件,它包含了會深深影響Mybatis行為的設(shè)置和屬性信息;一個是映射文件,它很簡單,讓用戶能更專注于SQL代碼,本文主要介紹了Mybatis的核心配置文件使用方法,感興趣的可以了解一下
    2023-11-11
  • Mybatis一對多和多對一處理的深入講解

    Mybatis一對多和多對一處理的深入講解

    Mybatis可以通過關(guān)聯(lián)查詢實(shí)現(xiàn),關(guān)聯(lián)查詢是幾個表聯(lián)合查詢,只查詢一次,通過在resultMap里面的association,collection節(jié)點(diǎn)配置一對一,一對多的類就可以完成,這篇文章主要給大家介紹了關(guān)于Mybatis一對多和多對一處理的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • Spring Boot循環(huán)依賴的癥狀和解決方案

    Spring Boot循環(huán)依賴的癥狀和解決方案

    循環(huán)依賴是指在Spring Boot 應(yīng)用程序中,兩個或多個類之間存在彼此依賴的情況,形成一個循環(huán)依賴鏈。這篇文章主要介紹了SpringBoot循環(huán)依賴的癥狀和解決方法
    2023-04-04
  • 一文詳解如何使用Java來發(fā)送qq郵箱郵件

    一文詳解如何使用Java來發(fā)送qq郵箱郵件

    這篇文章主要給大家介紹了關(guān)于如何使用Java來發(fā)送qq郵箱郵件的相關(guān)資料,文中降了準(zhǔn)備工作(開啟服務(wù)并生成授權(quán)碼)、接口調(diào)用(引入依賴和編寫接口代碼)、發(fā)送HTML格式郵件等內(nèi)容,需要的朋友可以參考下
    2024-12-12
  • 使用@Valid 校驗(yàn)嵌套對象

    使用@Valid 校驗(yàn)嵌套對象

    這篇文章主要介紹了使用@Valid 校驗(yàn)嵌套對象方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java圖像之自定義角度旋轉(zhuǎn)(實(shí)例)

    Java圖像之自定義角度旋轉(zhuǎn)(實(shí)例)

    這篇文章主要介紹了Java圖像之自定義角度旋轉(zhuǎn)(實(shí)例),需要的朋友可以參考下
    2017-09-09
  • java中如何使用泛型方法比較大小

    java中如何使用泛型方法比較大小

    這篇文章主要介紹了java中如何使用泛型方法比較大小,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Java 8 Lambda 表達(dá)式比較器使用示例代碼

    Java 8 Lambda 表達(dá)式比較器使用示例代碼

    這篇文章主要介紹了Java 8 Lambda 表達(dá)式比較器使用示例代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • Shiro安全框架的主要組件及認(rèn)證過程簡介

    Shiro安全框架的主要組件及認(rèn)證過程簡介

    這篇文章主要介紹了Shiro安全框架的主要組件及認(rèn)證過程簡介,Shiro?是一個強(qiáng)大靈活的開源安全框架,可以完全處理身份驗(yàn)證、授權(quán)、加密和會話管理,本文就來介紹一下此框架的核心組成,需要的朋友可以參考下
    2023-08-08
  • JVM的GC日志及運(yùn)行參數(shù)解讀

    JVM的GC日志及運(yùn)行參數(shù)解讀

    這篇文章主要為大家介紹了JVM的GC日志及運(yùn)行參數(shù)解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09

最新評論