关于使用hibernate来分页的有关问题,小弟我实践了很久发现,数据量多就会内存溢出,路过的大神可以看看,也许在你们没成为大神前也是这样子处理的

关于使用hibernate来分页的问题,我实践了很久发现,数据量多就会内存溢出,路过的大神可以看看,也许在你们没成为大神前也是这样子处理的
情况是这样的
if(query.getResultList() != null && query.getResultList().size() > 0){
NewPageModule newpageModule = NewPageModuleUtil.createPage(
pageSize, query.getResultList().size(), PageModuleContext
.getOffset());
newpageModule.setPageList(query.setFirstResult(
newpageModule.getBeginIndex()).setMaxResults(
newpageModule.getPageSize()).getResultList());
return newpageModule;
}
每次都需要判断query.getResultList()是空的,如果不判断,直接取的话,直接调用后面的话,会报错,现在很难搞,数据量小的时候不觉得这个有问题,但是数据量大的时候就出现问题
分页有两种实现方式我的理解:第一种是把所有的数据取出来放进内存,然后用到哪几条再去取,
第二种是传入分页大小,用到哪几条现实在到数据库查,
一般情况下都是用第二中情况的比较多,但是我上边的代码,代码的主体本来是用第二中方法,但仔细看他是第一众情况完全执行了,然后再执行第二种情况,这个数据量就出现内存溢出.
这个只是这里的情况,还有一种情况是这个方法参数带了很多,而分页需要根据不同的参数组合去查不同的结果集然后分页.我也知道java里边能尽量不要用list的地方就不要要用,但是这个结果集没有办法,每次把不需要的查了一大堆出来,都不知道改怎么改进分页,求大神知道现在主流的分页是怎么处理的
------解决方案--------------------
楼主 首先提一个建议 query.getResultList() 在这几行代码调用了三次,也就是会跟数据库做三次交互,这个也是浪费资源的
建议楼主先将这个结果集定义个变量接收了,然后使用结果集变量去操作,这样省两次数据库交互,可以省一些资源出来。
其次 使用代码框来显示代码,这样看着清晰很多

------解决方案--------------------
应该不会溢出的吧   hibernate不是返回一个在一级缓存里面的代理对象么     对象内部就一个主键ID的啊
使用数据的时候才去查询的啊
------解决方案--------------------
5张表相互关联?因为只是查询,没有修改数据,索引视图可以提高性能。