分页缓存设置

1,对于分页来说,效率是关键,本例是在分页的时候,缓存5页记录,默认每页20条,缓存大小100,这可以修改的;

2,基本思路是:第一次查的时候,先判断缓存中存不存在当前页的数据,如果存在,查找缓存中的数据,如果不存在,则去数据库中查询5页数据放入缓存中,然后再缓存中读取数据。如果是当前页是前3页,那么读取1-5页的数据,如果当前页是后3页,读取后5页的数据,如果是中间页,读取当前页前两页+当前页+当前页后两页的数据;


一,分页的参数封装类、返回结果封装类;

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.dg11185.iyw.common;  
  2.   
  3.   
  4. /** 
  5.  * 分页的参数类 
  6.  *  
  7.  * @author  
  8.  * @since 1.0 
  9.  * @Copyright 2013 
  10.  */  
  11. public class PagingParams {  
  12.     private Integer nextPage;// 需要显示内容的页码  
  13.     private Integer pageSize; // 每页的条数  
  14.     private String allSizeHql; // 查询总记录条数的hql  
  15.     private String queryHql; // 查询记录的hql  
  16.     private Class clazz;  //查询对象的class类  
  17.   
  18.   
  19.     //设置下一页的页码  
  20.     public Integer getNextPage() {  
  21.         if (nextPage == null || "".equals(nextPage)) {  
  22.             return  1;  
  23.         }else {  
  24.             return nextPage;  
  25.         }  
  26.     }  
  27.       
  28.     public Class getClazz() {  
  29.         return clazz;  
  30.     }  
  31.   
  32.     public void setClazz(Class clazz) {  
  33.         this.clazz = clazz;  
  34.     }  
  35.       
  36.     public void setNextPage(Integer nextPage) {  
  37.         this.nextPage = nextPage;  
  38.     }  
  39.   
  40.     public Integer getPageSize() {  
  41.         if (pageSize == null || "".equals(pageSize)) {  
  42.             int configSize = Integer.parseInt(SysConfig.getProperty("pageSize"));  
  43.             return configSize;  
  44.         }else {  
  45.            return pageSize;  
  46.         }  
  47.     }  
  48.   
  49.     //设置每页条数  
  50.     public void setPageSize(Integer pageSize) {  
  51.         this.pageSize = pageSize;  
  52.     }  
  53.   
  54.     public String getAllSizeHql() {  
  55.         return allSizeHql;  
  56.     }  
  57.   
  58.     public void setAllSizeHql(String allSizeHql) {  
  59.         this.allSizeHql = allSizeHql;  
  60.     }  
  61.   
  62.     public String getQueryHql() {  
  63.         return queryHql;  
  64.     }  
  65.   
  66.     public void setQueryHql(String queryHql) {  
  67.         this.queryHql = queryHql;  
  68.     }  
  69. }  
[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.dg11185.iyw.common;  
  2.   
  3. import java.util.List;  
  4.   
  5. /** 
  6.  * 分页结果类 
  7.  *  
  8.  * @author 黄文韬 
  9.  * @since 1.0 
  10.  * @Copyright 2013 东莞市邮政局All rights reserved. 
  11.  */  
  12. public class PagingResults {  
  13.     private int currentPage; //当前页码  
  14.     private int totalSize;   //总共条数  
  15.     private int totalPages;  //总共页数  
  16.     private List list;       //结果集  
  17.       
  18.     public int getCurrentPage() {  
  19.         return currentPage;  
  20.     }  
  21.     public void setCurrentPage(int currentPage) {  
  22.         this.currentPage = currentPage;  
  23.     }  
  24.     public int getTotalSize() {  
  25.         return totalSize;  
  26.     }  
  27.     public void setTotalSize(int totalSize) {  
  28.         this.totalSize = totalSize;  
  29.     }  
  30.     public int getTotalPages() {  
  31.         return totalPages;  
  32.     }  
  33.     public void setTotalPages(int totalPages) {  
  34.         this.totalPages = totalPages;  
  35.     }  
  36.     public List getList() {  
  37.         return list;  
  38.     }  
  39.     public void setList(List list) {  
  40.         this.list = list;  
  41.     }  
  42. }  

二,分页缓存类

[java]  view plain copy
  1. package com.dg11185.iyw.common;  
  2.   
  3.   
  4. import java.io.IOException;  
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7.   
  8.   
  9. import javax.annotation.Resource;  
  10.   
  11.   
  12. import org.apache.log4j.Logger;  
  13.   
  14.   
  15. import com.dg11185.iyw.baseDAO.BaseDAOImpl;  
  16.   
  17.   
  18. /** 
  19.  * 分页缓存类 
  20.  * @author hwt 
  21.  * 
  22.  */  
  23. public class CachePage {  
  24.     private static final Logger LOGGER = Logger.getLogger(CachePage.class);  
  25.     @Resource  
  26.     private BaseDAOImpl baseDAOImpl;  
  27.       
  28.     private int pageStart = 1// 页码  
  29.     private int pageSize = 20// 每页显示的大小  
  30.     private int pageNum = 0;  //总页数  
  31.     private int totalNum = 0//总记录条数  
  32.     //private int cacheSize = 100; // 缓存大小  
  33.     private List cacheList = new ArrayList(); // 缓存列表  
  34.       
  35.     /** 
  36.      * 构造方法 
  37.      * @param pageSize 每页大小 
  38.      * @param cacheSize 缓存大小 
  39.      */  
  40.     public CachePage(Integer pageSize) {  
  41.         this.pageSize = pageSize;  
  42.     }  
  43.   
  44.   
  45.     /** 
  46.      * 判断是否存在缓存中 
  47.      *  
  48.      * @param page 
  49.      *            页码 
  50.      * @return 
  51.      */  
  52.     public boolean inCache(int page) {  
  53.         // 当前缓存对象的个数  
  54.        int cacheNum = cacheList.size();  
  55.        if (cacheNum > 0) {  
  56.             if (page <= 0) {  
  57.                 page = 1;  
  58.             }  
  59.             // 判断当前页是不是在缓存中  
  60.             if (page >= pageStart && (page - pageStart) * pageSize <= cacheNum) {  
  61.                 return true;  
  62.             } else {  
  63.                 return false;  
  64.             }  
  65.         }else {  
  66.             return false;  
  67.         }  
  68.     }  
  69.   
  70.   
  71.     /** 
  72.      * 清空缓存 
  73.      * @param pageNum 起始页 
  74.      */  
  75.     public void refleshCache() {  
  76. //      this.isFirst = true;  
  77.         for (int i = cacheList.size() -1 ; i  >= 0; i--) {  
  78.             cacheList.remove(i);  
  79.         }  
  80.     }  
  81.   
  82.   
  83.     /** 
  84.      * 新增缓存 
  85.      *  
  86.      * @param doc 
  87.      */  
  88.     public void addCache(Object obj) {  
  89.         if (this.cacheList.size() < pageSize*5) {  
  90.             this.cacheList.add(obj);  
  91.         } else {  
  92.             LOGGER.info("缓存池已满");  
  93.         }  
  94.     }  
  95.       
  96.     /** 
  97.      * 读缓存中的数据 
  98.      * @param page 
  99.      * @return 
  100.      */  
  101.     public PagingResults readCache(int page) {  
  102.         int start = (page - pageStart) * pageSize;  
  103.         int end = start + pageSize > cacheList.size() ? cacheList.size()  
  104.                 : start + pageSize;  
  105.         //缓存中的结果集  
  106.         List cacheRs = new ArrayList();  
  107.         for (int i = start; i < end; i++) {  
  108.             cacheRs.add(cacheList.get(i));  
  109.         }  
  110.           
  111.         //缓存结果集  
  112.         PagingResults pageResult = new PagingResults();  
  113.         pageResult.setCurrentPage(page); //当前页  
  114.         pageResult.setTotalSize(totalNum); //总记录条数  
  115.         pageResult.setTotalPages(pageNum); //总页数  
  116.         pageResult.setList(cacheRs);  
  117.           
  118.         return pageResult;  
  119.     }  
  120.       
  121.     /** 
  122.      * 搜索 
  123.      * @param query query对象 
  124.      * @param sort 排序对象 
  125.      * @param page 页码 
  126.      * @return 
  127.      */  
  128.     public PagingResults search(PagingParams params) throws IOException{  
  129.         int page = params.getNextPage();  
  130.         if (page < 0) {  
  131.             page = 1;  
  132.         }  
  133.         //如果存在缓存中  
  134.         if (inCache(page)) {  
  135.             return readCache(page);  
  136.         }else {//如果不在缓存中  
  137.             //总共记录条数  
  138.             int totalNum = baseDAOImpl.getSum(params.getAllSizeHql());  
  139.             //总页数  
  140.             int pageNum = totalNum % pageSize == 0 ? totalNum / pageSize : totalNum / pageSize + 1;  
  141.               
  142.             if (page > pageNum) {  
  143.                 page = pageNum;  
  144.             }  
  145.               
  146.             //保存当前页的前后两页放入缓存中  
  147.             int startPage = 1;  
  148.             int endPage   = 1;  
  149.             if (page <= 5) { //前五页  
  150.                 startPage = 1;  
  151.                 endPage = startPage + 4 > pageNum ? pageNum : startPage + 4;  
  152.             }else if(page >= pageNum - 4){ //后五页  
  153.                 endPage = pageNum ;  
  154.                 startPage = endPage - 4 < 0 ? 1 : endPage - 4;  
  155.             } else { //中间页  
  156.                 startPage = page - 2 <= 0 ? 1 : page - 2;  
  157.                 endPage   = page + 2 > pageNum ? pageNum : page + 2;  
  158.             }  
  159.               
  160.             //清空缓存  
  161.             refleshCache();  
  162.               
  163.             //得到缓存结果集  
  164.             List resultList = baseDAOImpl.getAllResults(params.getQueryHql(),startPage,pageSize*5,params.getClazz());  
  165.               
  166.             //将对象加入缓存中  
  167.             for (int i = 0,len = resultList.size() ; i < len; i++) {  
  168.                 addCache(resultList.get(i));  
  169.             }  
  170.               
  171.             //替换缓存集合  
  172.             this.pageNum = pageNum;  
  173.             this.totalNum = totalNum;  
  174.             this.pageStart = startPage;  
  175.               
  176.             return readCache(page);  
  177.         }  
  178.     }  
  179.   
  180.   
  181.     public Integer getPageSize() {  
  182.         return pageSize;  
  183.     }  
  184.   
  185.   
  186.     public void setPageSize(Integer pageSize) {  
  187.         this.pageSize = pageSize;  
  188.     }  
  189.   
  190.   
  191.     public Integer getPageStart() {  
  192.         return pageStart;  
  193.     }  
  194.   
  195.   
  196.     public void setPageStart(Integer pageStart) {  
  197.         this.pageStart = pageStart;  
  198.     }  
  199.   
  200.   
  201. //  public Integer getCacheSize() {  
  202. //      return cacheSize;  
  203. //  }  
  204. //  
  205. //  public void setCacheSize(Integer cacheSize) {  
  206. //      this.cacheSize = cacheSize;  
  207. //  }  
  208. }  



三,dao层的两个方法,其他方法省略....

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.dg11185.iyw.baseDAO;  
  2.   
  3. import java.sql.CallableStatement;  
  4. import java.sql.Connection;  
  5. import java.sql.PreparedStatement;  
  6. import java.sql.ResultSet;  
  7. import java.sql.ResultSetMetaData;  
  8. import java.sql.SQLException;  
  9. import java.util.ArrayList;  
  10. import java.util.HashMap;  
  11. import java.util.List;  
  12. import java.util.Map;  
  13.   
  14. import javax.annotation.Resource;  
  15. import javax.sql.DataSource;  
  16.   
  17. import org.springframework.dao.DataAccessException;  
  18. import org.springframework.jdbc.core.BatchPreparedStatementSetter;  
  19. import org.springframework.jdbc.core.CallableStatementCallback;  
  20. import org.springframework.jdbc.core.CallableStatementCreator;  
  21. import org.springframework.jdbc.core.SqlParameter;  
  22. import org.springframework.jdbc.core.support.JdbcDaoSupport;  
  23. import org.springframework.stereotype.Repository;  
  24.   
  25. import com.dg11185.iyw.common.ObjectRowMapper;  
  26. import com.dg11185.iyw.common.PagingParams;  
  27.   
  28. /** 
  29.  * BaseDAO的实现类 
  30.  *  
  31.  * @author 黄文韬 
  32.  * @since 1.0 
  33.  * @Copyright 2013 东莞市邮政局All rights reserved. 
  34.  */  
  35. @Repository  
  36. public class BaseDAOImpl extends JdbcDaoSupport implements BaseDAO {  
  37.   
  38.     @Resource(name = "dataSource")  
  39.     public void setMyDataSource(DataSource dataSource) {  
  40.         super.setDataSource(dataSource);  
  41.     }  
  42.   
  43.     /** 
  44.      * 根据序列得到记录的ID 
  45.      *  
  46.      * @param seqName 
  47.      * @return 
  48.      */  
  49.     @Override  
  50.     public int getTableId(String seqName) {  
  51.         String queryId = "select " + seqName + ".nextval from dual";  
  52.         return getJdbcTemplate().queryForInt(queryId);  
  53.     }  
  54.   
  55.     /** 
  56.      * 得到所有的记录 
  57.      *  
  58.      * @param sql 查询sql 
  59.      * @param startPage  起始页 
  60.      * @param pageSize 每页大小 
  61.      * @param claszz 查询的类名 
  62.      * @return 
  63.      */  
  64.     public List getAllResults(String sql, Integer startPage, Integer pageSize,  
  65.             Class claszz) {  
  66.         // 终止位置  
  67.         int start = (startPage - 1) * pageSize + 1;  
  68.         int end = startPage * pageSize;  
  69.         // 得到分页数据  
  70.         String allSQL = "select * from(select rownum rn,e.* from (" + sql  
  71.                 + ") e where rownum <= " + end + ") where rn >= " + start;  
  72.         List locations = getJdbcTemplate().query(allSQL,  
  73.                 new ObjectRowMapper(claszz));  
  74.         return locations;  
  75.     }  
  76.   
  77.     /** 
  78.      * 得到总共的数据 
  79.      *  
  80.      * @param sql 
  81.      * @return 
  82.      */  
  83.     @Override  
  84.     public int getSum(String sql, Object... obj) {  
  85.         return getJdbcTemplate().queryForInt(sql, obj);  
  86.     }  
  87.   
  88.       
  89.        //。。。。(其他方法省略)  
  90. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值