前言
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);
}
分享到:
相关推荐
Hibernate二级缓存Hibernate二级缓存Hibernate二级缓存Hibernate二级缓存Hibernate二级缓存
hibernate 二级缓存详解hibernate 二级缓存详解hibernate 二级缓存详解hibernate 二级缓存详解hibernate 二级缓存详解hibernate 二级缓存详解hibernate 二级缓存详解hibernate 二级缓存详解hibernate 二级缓存详解
基于hibernate二级缓存使用的源码实例
hibernate一级缓存和二级缓存的区别与联系
Hibernate 二级缓存
hibernate二级缓存 ehcache
hibernate二级缓存介绍及演示代码
呈现了hibernate二级缓存 的基本用法 相信可参照相关文档 来学习
Hibernate 一级缓存和二级缓存的区别
传播智客,为Spring集成的Hibernate配置二级缓存、cache.xml
为Spring集成的Hibernate配置二级缓存
hibernate二级缓存java包下载,在博客中有讲解,请观看
Hibernate一级缓存、二级缓存以及查询缓存实例
基于springboot最新版本2.1.4.RELEASE,采用jpa为dao层框架,配置redis(redisson)为hibernate的二级缓存。
hibernate的一级缓存和二级缓存,hibernate的一级缓存和二级缓存,hibernate的一级缓存和二级缓存,hibernate的一级缓存和二级缓存,hibernate的一级缓存和二级缓存
主要讲解hibernate缓存的配置和和使用方法,以及一级缓存和二级缓存的定义和区别,和查询缓存的使用
上传了 hibernate二级缓存所需要的jar 包, 里面的3个jar包一起用!
做一个hibernate 二级缓存的例子,其中都已经加了注释,一看就明白,数据库需要自己建