大数据量下PageHelper分页查
作者:岁月安然 blog.csdn.net/baidu_/article/details/ 前因项目一直使用的是PageHelper实现分页功能,项目前期数据量较少一直没有什么问题。随着业务扩增,数据库扩增PageHelper出现了明显的性能问题。 几十万甚至上百万的单表数据查询性能缓慢,需要几秒乃至十几秒的查询时间。故此特地研究了一下PageHelper源码,查找PageHelper分页的实现方式。 一段较为简单的查询,跟随debug开始源码探寻之旅。 publicResultContentselect(Integerid){PageTestblogPage=PageHelper.startPage(1,3).doSelectPage(()-testDao.select(id));ListTesttest=(ListTest)blogPage.getResult();returnnewResultContent(0,"success",test);} 主要保存由前端传入的pageNum(页数)、pageSize(每页显示数量)和count(是否进行count(0)查询)信息。 这里是简单的创建page并保存当前线程的变量副本心里,不做深究。 publicstaticEPageEstartPage(intpageNum,intpageSize){returnstartPage(pageNum,pageSize,DEFAULT_COUNT);}publicstaticEPageEstartPage(intpageNum,intpageSize,booleancount){returnstartPage(pageNum,pageSize,count,(Boolean)null,(Boolean)null);}publicstaticEPageEstartPage(intpageNum,intpageSize,StringorderBy){PageEpage=startPage(pageNum,pageSize);page.setOrderBy(orderBy);returnpage;}publicstaticEPageEstartPage(intpageNum,intpageSize,booleancount,Booleanreasonable,BooleanpageSizeZero){PageEpage=newPage(pageNum,pageSize,count);page.setReasonable(reasonable);page.setPageSizeZero(pageSizeZero);PageEoldPage=getLocalPage();if(oldPage!=nulloldPage.isOrderByOnly()){page.setOrderBy(oldPage.getOrderBy());}setLocalPage(page);returnpage;} 开始执行真正的select语句 publicEPageEdoSelectPage(ISelectselect){select.doSelect();returnthis;} 进入MapperProxy类执行invoke方法获取到方法名称及参数值 publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{if(Object.class.equals(method.getDeclaringClass())){try{returnmethod.invoke(this,args);}catch(Throwablet){throwExceptionUtil.unwrapThrowable(t);}}finalMapperMethodmapperMethod=cachedMapperMethod(method);returnmapperMethod.execute(sqlSession,args);} 接着是MapperMethod方法执行execute语句,判断是增、删、改、查。判断返回值是多个,进入executeForMany方法 publicObjectexecute(SqlSessionsqlSession,Object[]args){Objectresult;if(SqlCommandType.INSERT== |
转载请注明地址:http://www.huluchaa.com/hlcmy/7599.html
- 上一篇文章: 三叶草种子的连续弹射,植物界中的多米诺骨
- 下一篇文章: 56朵花毛南族传统节庆文化