作者:岁月安然

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