java

位置:IT落伍者 >> java >> 浏览文章

Hibernate的批量处理[2]


发布日期:2018年09月28日
 
Hibernate的批量处理[2]

还是用Hibernate API 来进行常规的批量处理可以也有变变就变在我们可以在查找出一定的量的时候及时的将这些数据做完操作就删掉sessionflush()sessionevict(XX对象集) 这样也可以挽救一点性能损失这个一定的量要就要根据实际情况做定量参考了……(实例为 保存操作)

业务逻辑为我们要想数据库插入 条数据

tx=sessionbeginTransaction()

for(int i=i<i++)

{

Customer custom=new Customer()

customsetName(user+i)

sessionsave(custom)

if(i%==) // 以每个数据作为一个处理单元也就是我上面说的一定的量这个量是要酌情考虑的

{

sessionflush()

sessionclear()

}

}

这样可以把系统维持在一个稳定的范围……

在项目的开发过程之中由于项目需求我们常常需要把大批量的数据插入到数据库数量级有万级十万级百万级甚至千万级别的如此数量级别的数据用Hibernate做插入操作就可能会发生异常常见的异常是OutOfMemoryError(内存溢出异常)

首先我们简单来回顾一下Hibernate插入操作的机制Hibernate要对它内部缓存进行维护当我们执行插入操作时就会把要操作的对象全部放到自身的内部缓存来进行管理

谈到Hibernate的缓存Hibernate有内部缓存与二级缓存之说由于Hibernate对这两种缓存有着不同的管理机制对于二级缓存我们可以对它的大小进行相关配置而对于内部缓存Hibernate就采取了放任自流的态度了对它的容量并没有限制现在症结找到了我们做海量数据插入的时候生成这么多的对象就会被纳入内部缓存(内部缓存是在内存中做缓存的)这样你的系统内存就会一点一点的被蚕食如果最后系统被挤也就在情理之中了

我们想想如何较好的处理这个问题呢?有的开发条件又必须使用Hibernate来处理当然有的项目比较灵活可以去寻求其他的方法

笔者在这里推荐两种方法

优化Hibernate程序上采用分段插入及时清除缓存的方法

绕过Hibernate API 直接通过 JDBC API 来做批量插入这个方法性能上是最 好的也是最快的

对于上述中的方法其基本是思路为优化Hibernate在配置文件中设置hibernatejdbcbatch_size参数来指定每次提交SQL的数量程序上采用分段插入及时清除缓存的方法(Session实现了异步writebehind它允许Hibernate显式地写操作的批处理)也就是每插入一定量的数据后及时的把它们从内部缓存中清除掉释放占用的内存

[] [] [] [] []

               

上一篇:Hibernate的批量处理[3]

下一篇:Hibernate的批量处理[1]