浏览 1620 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-08-06
hibernate查询缓存很难用,更新某个实体后会导致与此实体相关的所有查询缓存失效,很不爽; 此方案建立在hibernate二级缓存的基础上 目的 缓存帖子的每一页(即回帖) 何时写缓存?何时清理缓存? 读取帖子第N页是缓存之,有回帖 修改回帖 删除回帖时清理缓存 缓存结构 /** * 帖子分页缓存。 * cache key为帖子id; * cache value为Map,key为页号; value为post id串,如‘2#3#4#5’ */ private static Map<Integer, Map<Integer, String>> threadPostCache = new LRULinkedHashMap<Integer, Map<Integer, String>>(10000); 外层map以帖子id为主键,内层map以页号为主键,内层map的value为回帖id串 如‘2#3#4#5’ 外层Map采用LRULinkedHashMap 真正的回帖数据在hibernate二级缓存中,下面是读取二级缓存的逻辑代码 @Override public Page<ThreadPost> getPage(int pageNo, int pageSize, Integer postNum, Integer threadId) { pageNo = pageNo == 0 ? 1 : pageNo; Page<ThreadPost> page = null; Map<Integer, String> pageMap = threadPostCache.get(threadId); if(pageMap == null){ pageMap = new HashMap<Integer, String>(); } String postIdString = pageMap.get(pageNo); if(postIdString == null){ //从数据库中加载Page page = threadPostManager.getPage(pageNo, pageSize, postNum, threadId); //生成postIdString postIdString = joinPostId(page.getDataSet()); pageMap.put(pageNo, postIdString); threadPostCache.put(threadId, pageMap); }else{ page = buildPage(pageNo, pageSize, postNum, postIdString); } return page; } //构造一个Page对象 private Page<ThreadPost> buildPage(int pageNo, int pageSize, Integer postNum, String postIdString){ if(StringUtils.isBlank(postIdString)){ return Page.EMPTY_PAGE; } List<ThreadPost> list = new ArrayList<ThreadPost>(postIdString.length()); for(String postId : postIdString.split("#")){ //[color=red]从hibernate二级缓存中读取[/color] list.add(threadPostManager.get(Integer.valueOf(postId))); } return new Page<ThreadPost>(pageNo, postNum, pageSize, list); } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |