问题描述
现在项目中需要对数据进行导出,1万条记录。在excel导出过程,查到hibernate查询时候,内存值会有100M的峰值,加上其他业务,就会报内存溢出问题。hibernate如何做到list查询出来数据,内存峰值能够比较小(实际对象占用只有50M样子),数据需要导出,所以iterator也不适合。那位大牛知道如何查询内存值保持一定的稳定值,变化不能太大
解决方案
个人认为针对具体的问题要根据实际情况选择最适合的工具,楼主说的这种场景其实完全可以用数据库工具来做,没必要非得用Hibernate甚至非得用Java来做,Oracle/MySQL都有非常好用的数据导出工具
解决方案二:
不知道你的问题解决了没有,可以利用hibernate的无状态session和滚动结果集来操作你说的问题,可以解决哈:伪代码:StatelessSession session=sessionFactory.openStatelessSession();Transaction t=session.beginTransaction();ScrollabeResults sResults=session.getNameQuery("hql").scroll(ScrollMode.FORWARD_ONLY);while(sResults.next()){ //你的代码}t.commit();session.close();.......滚动结果集不会立即查询,只会返回当前数据库的游标,你需要多少,就会差多少,而且无状态结果集不会使用一级,二级缓存!
解决方案三:
如果是导出的话就要用JDBC查询,连这个都要用Hibernate,简直就是滥用框架!
解决方案四:
分批次查询吧,分页思想
解决方案五:
只查需要的字段,不要用对象,这样应该会少很多,调整也比较简单
解决方案六:
你可以讲1万条记录分10次查询,每次只查询1000条记录,然后每个excel中只保存1000条记录。将10个excel文件先打成压缩包,然后将压缩包下载,这样应该比较节省内存
解决方案七:
首先你要确定你要导出的版本,我记得jxl导出的03版本的excle只支持2W条数据量的导出.解决方案有两个:1.把查询出来的数据分批(分行)导出,比如每50M为一个文件,然后程序再整合成一个文件.2.查询数据的时候不要得到对象的所有信息.只得到对象的ID.然后通过load来获取对象的所有信息.