Mybatis批量插入大数据导致堆内存溢出问题解决方案

Mybatis批量插入内存溢出

JVM环境:-Xms64m -Xmx128m

由于①mybatis的DAO接口我是传List,而mybatis的foreach底层代码是arrays的,②所以需要把List转arrays,然后遍历Arrays,③用StringBuilder拼接SQL的。

问题出现在②③步!因生成的arrays对象和StringBuilder对象是在堆内存中的,而堆内存的对象GC回收机制是:只有JVM的使用内存达到最大内存时的一定阀值,才会执行GC回收!

如果当本身JVM已经使用了占有了JVM的最大内存的90%,那么②③步的生成的对象占有内存+本身已占有的内存如果超出JVM的最大内存,而JVM又来不及执行GC时就会导致JVM内存溢出,当前线程挂掉!

我的解决方法是:实行多段相继执行,每次只批量执行3000个对象,从而保证Arrays和StringBuilder过大,当然3000个是相对于我的JVM环境而言,每个人也可以根据自身的JVM环境进行调优。上文观点是个人的理解,如果有什么不对的地方请指出,谢谢。

	public int batchSave(String stockCode, String stockType, String tableNum, List<StockMarket> stockMarkets) throws Exception {
		int size = stockMarkets.size();
		int index = 0;
		while(true) {
			if(index+3000>=size) {
				this.batchSave(stockType, tableNum, stockMarkets.subList(index, size-1));
				break;
			}else {
				this.batchSave(stockType, tableNum, stockMarkets.subList(index, index+3000));
				index = index+3000;
			}
			
		}
		return size;
	}

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值