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()则不管其他,直接将缓存清空,