日期:2014-05-18  浏览次数:20714 次

关于大批量的数据处理问题
得到一个数组 数量不限 可能几千个 可能几十万个
需要经过一轮判断 数据库中是否存在 存在则update 不存在则insert
现在碰到麻烦 处理到大概8000条的时候就报内存溢出的错误,虽然把jvm的虚拟内存设置更大能解决一时之问题
但是终究是治标不治本 如果碰到结果集的数量有上百万个呢?
我的思路是 处理一千条就清空hibernate的缓存一次
程序也有这样写 通过重调用dao层得到hibernate的session 在用char()处理
如 sameQuestionDao.getHibernateSession().clear();
结果好像代码并没有起到作用 到了大概8000条的 时候依然报内存溢出错误

求解.......

------解决方案--------------------
hibernate一级缓存和二级缓存的区别
------解决方案--------------------
这种东西你最好是分页处理
就是将数据集进行分页,然后再处理,而且hibernate中有批量处理的功能,你可以批量更新的

你内存溢出可能还有个情况,就是你的字符串操作太多,导致内存溢出了,或者判断条件太多 (if判断)
将判断条件转成sql实现,也就是说能用sql过滤的数据就直接过滤,不要在程序中用if语句过滤
------解决方案--------------------
探讨
这种东西你最好是分页处理
就是将数据集进行分页,然后再处理,而且hibernate中有批量处理的功能,你可以批量更新的

你内存溢出可能还有个情况,就是你的字符串操作太多,导致内存溢出了,或者判断条件太多 (if判断)
将判断条件转成sql实现,也就是说能用sql过滤的数据就直接过滤,不要在程序中用if语句过滤

------解决方案--------------------
用缓存吧,每次批量处理若干条数据,这样性能和安全性都得到保障
------解决方案--------------------
Hibernate本来对大数据量批量处理做的不好
当然手动清空缓存是一个方法
还不如直接jdbc来做
------解决方案--------------------
hibernate批量处理insert,update,delete那简直不叫速度,龟行!必须用JDBC

------解决方案--------------------
Hibernate的批量查询其实不是很快,但是可以省不少功夫,要真提高速度的还是jdbc,推荐用它!
------解决方案--------------------
jdbc