今天同事搞个东西,插入8000条数据,到了3000条就卡死了。。应该是session没释放,以下整理出出现该问题的解决方案。
大批量的数据插入到数据库。数量级有万级、十万级、百万级、甚至千万级别的。如此数量级别的数据用Hibernate做插入操作,就可能会发生异常,常见的异常是OutOfMemoryError(内存溢出异常)。
Hibernate插入操作的机制:Hibernate要对它内部缓存进行维护,当我们执行插入操作时,就会把要操作的对象全部放到自身的内部缓存来进行管理。
Hibernate的缓存:Hibernate有内部缓存与二级缓存之说。由于Hibernate对这两种缓存有着不同的管理机制,对于二级缓存,我们可以对它的大小进行相关配置,而对于内部缓存,Hibernate就采取了“放任自流”的态度了,对它的容量并没有限制。现在症结找到了,我们做海量数据插入的时候,生成这么多的对象就会被纳入内部缓存(内部缓存是在内存中做缓存的),这样你的系统内存就会一点一点的被蚕食,如果最后系统被挤“炸”了,也就在情理之中了
处理这个问题的两种方案:
1 优化Hibernate,程序上采用分段插入及时清除缓存的方法。
2 绕过Hibernate API ,直接通过 JDBC API 来做批量插入,这个方法性能上是最 好的,也是最快的。
对于上述中的方法1,其基本是思路为:优化Hibernate,在配置文件中设置hibernate.jdbc.batch_size参数,来指定每次提交SQL的数量;程序上采用分段插入及时清除缓存的方法(Session实现了异步write-behind,它允许Hibernate显式地写操作的批处理),也就是每插入一定量的数据后及时的把它们从内部缓存中清除掉,释放占用的内存。
设置hibernate.jdbc.batch_size参数,可参考如下配置。
<hibernate-configuration>
<session-factory>
.........
<property name=” hibernate.jdbc.batch_size”>50</property>
.........
<session-factory>
<hibernate-configuration>
Session session=HibernateUtil.currentSession();
Transatcion tx=session.beginTransaction();
for(int i=0;i<10000;i++)
...{
Student st=new Student();
st.setName(“feifei”);
session.save(st);
if(i%50==0) //以每50个数据作为一个处理单元
...{
session.flush(); //保持与数据库数据的同步
session.clear(); //清除内部缓存的全部数据,及时释放出占用的内存
}
}
tx.commit();
分享到:
相关推荐
Spring Hibernate 事务处理 详细说明 Spring Hibernate 事务处理 详细说明
自己开发中遇到的问题 希望对struts hibernate初学者有用
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以...
了解Hibernate的一个很好的文档,想学Hibernate的朋友可以载来看看。
在Hibernate中处理批量更新和批量删除
其实,我想如果我们应用得当的话,完全可以消除ORM批量处理性能问题这方面的顾虑。下面以Hibernate为例来做为说明,假如我们真的不得不在Java中使用Hibernate来对数据进行批量处理的话。 向数据库插入100 000条数据
hibernate中处理大字段 网上收集的文档
Hibernate事务处理Hibernate事务处理
hibernate常见问题及处理。
Hibernate事务与并发问题处理.pdf
spring+hibernate包冲突问题 spring+hibernate包冲突问题
一个项目中同时使用hibernate和ibatis两个orm框架,既利用到了hibernate的强大功能也弥补到了hibernate对大数据操作的性能上的影响
Hibernate面试题专栏 - 最全的Hibernate面试题, Hibernate笔试题, Hibernate问题 Hibernate教程
Hibernate不得不注意的问题,以及Hibernate的数据源
hibernate逆向生成小问题,主要是由数据库反向自成domain.
spring整合hibernate实现事务处理 1.spring整合hibernate实现事务处理-注解方式 2.spring整合hibernate实现事务处理-XML方式
Spring 1_2的hibernate事务处理,更加详细的说明事务的处理在SPRING中
在Java SE中使用Hibernate处理数据
Hibernate事务与并发问题处理[收集].pdf
hibernate注解处理映射关系共14页.pdf.zip