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

技术讨论:关于数据分页处理的效率。
在项目开发中,我们经常遇到数据分页显示.
如何处理才能让处理效率最高,希望大家来讨论一下!

我用的是Hibernate,刚开始时由于没有想那么多,便直接用List来处理:
(只写了主要步骤)

//获取Session对象,HibernateSessionFactory是用的MyEclipse自动生成的.
Session session=HibernateSessionFactory.getSession();
//查询users表中所有记录
Query query=session.createQuery("from hbm.Users");
//获取list对象
List list=query.list();
//总页数
int pages=list.size()/pagenum;
//每页显示数量
int pagenum=10;
//当前第几页
int page=1;
//获取此页要显示的数据
ArrayList currentList=new ArrayList();
currentList.clear();
for(int i=page*pagenum,j=0;j<pagenum;i++,j++)
{
if(i>=list.size()) break;
currentList.add(list.get(i));
}
session.close();

虽然这样做可以,但由于用List要求Hibernate将所有的数据都转换为java实体对象,而不管是否用到其中所有的对象,
这样,在只有部分对象使用时会造成资源浪费.
如果数据很多(如10000条以上吧),那要转换为10000个对象,那内存能受得了吗(恐怕早都满了!)?
于是便用了下面这种方法:

//获取Session对象,HibernateSessionFactory是用的MyEclipse自动生成的.
Session session=HibernateSessionFactory.getSession();
//查询users表中所有记录
Query query=session.createQuery("from hbm.Users");
//获取ScrollableResults
ScrollableResults sr=queryAll.scroll();
//移到最后
sr.last();
//获取总页数
int pages=(sr.getRowNumber()+1)/pageSize;
//每页显示数量
int pagenum=10;
//当前第几页
int page=1;
//再新建一个Session(由于我用一个session做两次查询时总出错,便只好再新建一个)
Session currentSession=HibernateSessionFactory.getSession();
//查询users表中所有记录
Query query=currentSession.createQuery("from hbm.Users");
//设置从第几条开始
query.setFirstResult(page*pagenum);
//设置查询的最大行数
query.setMaxResults(pagenum);
//获取list
List list=query.list();
//获取当前页要显示的数据
ArrayList currentList=new ArrayList();
for(int i=0;i<list.size();i++)
currentList.add(list.get(i));
session.close();
currentSession.close();

由于ScrollableResults不会全部初始化,只在用时初始化.这样便避免了第一种方法的缺点(将所有的数据都转换为java实体对象),只将要显示的数据转换.

但总感觉这样效率并不高(要建两个session),小弟不才,希望大家讨论一下,用那种方法才能使效率最高.




------解决方案--------------------
建议把读取数据和分页分开来写
这样最高,当然也麻烦了很多。。。。
你先count(pk)
根据pk来分页
然后再把数据放进去,随你怎么放了
------解决方案--------------------
hibernate 有自带的查询分页的方法你可以看下。。。。。
------解决方案--------------------
点击下一页或指定页数时再去访问读取数据库,
这我做的一个分页,见笑了
//显示所有主题列表
public ActionForward themeList(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)throws Exception{
ConnectDB cdb = new ConnectDB();
ResultSet resultSet = null;
resultSet = cdb.queryDataBase("select * from theme");
int data_num = 0; //记录总数
while(resultSet.next()) {
data_num++;
}
resultSet.close();
cdb.closeReslutSet();
cdb.closeStatement();
cdb.closeConnection();
int start = 1; //起始记录
int page = 15; //每页记录数
int pages = data_num/page; //取得总页数
int go = 1;
if(data_num%page != 0)pages++;
if(request.getParameter("start") != null)
start = Integer.parseInt(request.getParameter("start"));
//当发表主题成功调用themeList函数时,go为空,需指定go初值
if(request.getParameter("go") == null || request.getParameter("go").length() < 1) {
go = 1;
}
else{
go = Integer.parseInt(request.getParameter("go"));
if(go <= 1)start = 1;
else if(go > pages)
start =(pages - 1)* page +1;
el