`
xly_971223
  • 浏览: 1276766 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基于hibernate二级缓存的论坛缓存方案

阅读更多
前言
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);
	}
分享到:
评论
6 楼 yzzh9 2009-12-02  
很好的方法,可以直接用到二级缓存。
5 楼 maike 2009-10-15  
dingyuan 写道
hibernate的查询缓存缓存的是查询列表的id,只有在删除和插入操作时才会失效,更新操作只会更新对象缓存,查询缓存是不会失效的


想问下,更新某一个对象后是更新缓存中的所有对象还是只更新缓存中的这个对象? 谢谢!
4 楼 dingyuan 2009-09-22  
hibernate的查询缓存缓存的是查询列表的id,只有在删除和插入操作时才会失效,更新操作只会更新对象缓存,查询缓存是不会失效的
3 楼 xly_971223 2009-09-22  
qchong 写道
注意线程同步。。。

说的极是
2 楼 qchong 2009-09-22  
注意线程同步。。。
1 楼 dizdev 2009-09-09  
great!

我觉得是个非常适中的解决办法。

您的策率似乎是 当有新回帖的时候发一次SQL并更新缓存。 但是我思考中,论坛的高频率回复会否导致缓存刷新太频繁而失去意义。转而言之,虽然分页大大缓解SQL压力,但是频繁的访问同样迫切的要求有缓存存在。

因此牺牲一点点实时效率换取运行效率的方案比较Fit成本

相关推荐

    hibernate二级缓存实例

    在这个"hibernate二级缓存实例"中,我们将深入探讨二级缓存的原理、配置以及在实际项目中的应用。 首先,我们需要了解一级缓存和二级缓存的区别。一级缓存是Session级别的,每个Session都有自己的一级缓存,用于...

    hibernate一级缓存和二级缓存的区别与联系

    总结来说,Hibernate 的一级缓存和二级缓存都是为了提高数据访问效率,但它们在范围和并发控制方面有所不同。一级缓存是事务级别的,保证了数据的强一致性,而二级缓存提供了更多的灵活性,可以跨事务共享,但需要...

    Hibernate二级缓存

    Hibernate二级缓存是一种提高应用程序性能的技术,它将数据存储在SessionFactory级别的缓存中,使得数据可以在不同的Session之间共享。这与一级缓存(Session级别)不同,一级缓存仅存在于单个Session生命周期内,当...

    hibernate 二级缓存详解

    Hibernate 二级缓存是针对SessionFactory级别的全局缓存,与一级缓存(Session级别)不同,一级缓存只在单个Session生命周期内有效。二级缓存则允许不同Session之间共享数据,提高了数据访问效率,减少了对数据库的...

    hibernate二级缓存示例源码

    **hibernate二级缓存详解** Hibernate作为Java领域中广泛使用的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,在处理大量数据时,性能优化显得尤为重要,这就是二级缓存的作用。本文将深入探讨Hibernate...

    hibernate一级缓存、二级缓存和查询缓存

    **hibernate一级缓存、二级缓存和查询缓存** 在Java的持久化框架Hibernate中,缓存机制是提高应用程序性能的关键要素。缓存能够减少数据库的访问次数,提高数据读取速度,并且在一定程度上降低了系统的负载。本文将...

    hibernate二级缓存包

    Hibernate二级缓存是Java开发中使用Hibernate框架进行数据持久化时优化性能的一种重要技术。它在一级缓存(Session级别的缓存)的基础上,提供了一个全局的、跨会话的数据存储层,可以显著减少对数据库的访问,从而...

    day37 05-HIbernate二级缓存:一级缓存更新同步到二级缓存及二级缓存配置文件

    本篇文章将深入探讨Hibernate的二级缓存机制,以及如何进行一级缓存与二级缓存的同步,同时还会介绍二级缓存的配置文件设置。 一级缓存是Hibernate默认提供的缓存,每个SessionFactory实例都有一个一级缓存。当对象...

    Hibernate一级缓存和二级缓存

    **二、Hibernate二级缓存** 二级缓存是SessionFactory级别的,跨越了多个Session,可以被多个线程共享。它通常由第三方插件如EhCache、Infinispan等提供。二级缓存分为以下几种类型: 1. **集合缓存**:用于存储...

    Hibernate 二级缓存

    Hibernate 二级缓存

    hibernate二级缓存

    Hibernate 二级缓存是一种高效的数据存储机制,它能够显著提升Web应用的性能,尤其是在处理大量数据流动时。缓存的主要目标是减少应用与数据库之间的交互次数,从而降低延迟并减轻数据库服务器的压力。在Hibernate...

    hibernate二级缓存java包下载

    二级缓存是 Hibernate 缓存策略的一部分,它在应用程序的多个会话之间共享数据,进一步优化了数据库访问效率。 二级缓存分为以下关键知识点: 1. **一级缓存与二级缓存的区别**: - 一级缓存:每个 Hibernate ...

    springboot+jpa(hibernate配置redis为二级缓存) springboot2.1.4

    通过以上步骤,我们就成功地在Spring Boot 2.1.4.RELEASE项目中配置了使用Redis作为Hibernate二级缓存的环境。这将显著提升数据库查询效率,减少对数据库的压力,尤其在高并发场景下,效果尤为明显。记得在实际生产...

    Hibernate 二级缓存 总结整理

    **Hibernate 二级缓存总结整理** 在Java的持久化框架中,Hibernate是一个广泛使用的ORM(对象关系映射)工具,它极大地简化了数据库操作。在处理大数据量或高并发的场景下,为了提高性能和减少数据库负载,...

    Spring集成的Hibernate配置二级缓存

    以EhCache为例,我们需要在项目中引入ehcache-core或ehcache的依赖,并在Hibernate配置文件(hibernate.cfg.xml或persistence.xml)中启用二级缓存,添加如下配置: ```xml &lt;property name="hibernate.cache.use_...

    为Spring集成的Hibernate配置二级缓存

    2. **配置Hibernate**:在Hibernate的配置文件`hibernate.cfg.xml`中启用二级缓存并指定缓存提供商。以下是一个使用Ehcache的示例: ```xml &lt;property name="hibernate.cache.use_second_level_cache"&gt;true ...

    hibernate一级和二级缓存配置与详解

    本篇将深入探讨Hibernate的一级缓存和二级缓存,以及查询缓存的配置和使用。 ### 一级缓存 一级缓存是Hibernate默认提供的缓存,它是Session级别的,每个Hibernate Session都有一个私有的、本地的一级缓存。当我们...

    hibernate二级缓存所需要的 jar包

    本篇将详细介绍Hibernate二级缓存的概念、作用以及所需jar包的作用。 一、Hibernate二级缓存概念 Hibernate的一级缓存是指Session级别的缓存,每个Session内部都有一个一级缓存,用于存储实体对象,当Session关闭时...

    Hibernate一级缓存、二级缓存以及查询缓存实例

    本文将深入探讨Hibernate的一级缓存、二级缓存以及查询缓存,通过具体的实例来阐述它们的工作原理和使用方法。 首先,我们从一级缓存开始。一级缓存是Hibernate默认提供的缓存,它是每个Session级别的,也被称为...

    hibernate 二级缓存

    本篇文章将深入探讨Hibernate二级缓存的概念、工作原理以及如何在实际项目中设置和使用。 **一、二级缓存概念** 一级缓存是每个Hibernate Session内部的一个内存区域,用于存储Session期间的操作对象。当Session...

Global site tag (gtag.js) - Google Analytics