hibernate批处理

在hibernate处理大量数据事务时,一次性commit可能导致内存溢出。为解决此问题,hibernate提供了批处理功能,允许在内存达到一定操作数(如20)时手动提交事务。通过配置文件设置批处理大小,可以有效避免内存占用过高。此外,文中还提及了flush()和clear()的区别:flush()在清空缓存前先提交所有待执行的sql,而clear()则直接清除缓存不考虑未提交的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hibernate中进行事务处理的时候,会将一个事务中的所有操作集中commit,假设一种情况,同时有数十万甚至数百万插入数据的sql一起执行,那么会出现这么一个情况,

就是在还没有等到commit的时候,内存就已经占满了,eclipse会报一个内存溢出的error,如果想要模拟这个异常,可以设置一个20万次的循环,当然如果电脑足够好的话,

还可以往上增加。。。

hibernate提供了解决这种麻烦的手段,那就是批处理。

首先,需要在hibernate的配置文件中加入这样一条设置,其中数值20是自定义的,也就是批处理的数量,当内存中有这么多次操作等待提交的时候,手动进行提交

 <property name="hibernate.jdbc.batch_size" >20</property>


下面是测试:

package com.test;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.entity.User;
import com.util.HibernateUtil;

public class TestBatch {

	public static void main(String[] args) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction tr = session.beginTransaction();
		for(int i=0;i<2000;i++){
			User user = new User("wangwu", "wangwu", "1111111", "wangwu", 1, 22);
			session.save(user);
			if(i%20==0){//20与hibernate.cfg.xml中设置的数量保持一直
				session.flush();
				session.clear();
			}
		}
		tr.commit();
		session.close();
	}
}

这里顺便说一下flush()和clear()方法的区别,本来是属于缓存那一块的内容,前面忘记写了,就在这里提一下。

flush()是将缓存清空,但是在清空之前,它会将内存中等待提交的sql执行完了之后再清空(主要是增、删、改),

而claer()则不管其他,直接将缓存清空,



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值