`
happyforever82
  • 浏览: 121373 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

如何使用hibernate二级缓存及在必要的时候联机清除cache (这个有用)

阅读更多

    入门使用cache很简单。
1/ 在 classpath根下建 ehcache.xml 内容如下:
<ehcache>   
     <diskStore path="java.io.tmpdir"/>    

     <defaultCache
         maxElementsInMemory="10000"
         eternal="false"
         overflowToDisk="true"
         timeToIdleSeconds="120"
         timeToLiveSeconds="120"
         diskPersistent="false"
         diskExpiryThreadIntervalSeconds="120"/>       
    
</ehcache>


2/ 修改需要使用缓存的对象所对应的hbm.xml文件。加入 <cache usage="read-only"/>标记。

3/ 默认情况下,load是使用缓存的。 但一般是使用find或者list方法来取得数据。所以按如下操作:
   修改 hibernate.cfg.xml 加入
   <property name="show_sql">true</property>
  <property name="hibernate.cache.use_query_cache">true</property>
        <property name="hibernate.cache.use_second_level_cache">true</property>
        <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

4/ 在DAO的代码中使用
  Session session = sf.openSession();
  try {
   
   Query query = session.createQuery("from StockInfo where id = ?");
   query.setLong(0, 1800);
   query.setCacheable(true);
   query.list();
   session.close();
      
   session = sf.openSession();
   query = session.createQuery("from StockInfo where id = ?");
   query.setLong(0, 1800);
   query.setCacheable(true);
   query.list();
  } catch (Exception ex) {
   log.info(ex.getMessage(), ex);
  }
你会发现只会打印出一条SQL语句。 证明使用了缓存功能。

下面是关键的另一步了。 在系统中,由于程序的bug或者特殊情况需要直接修改数据库 而又不允许停机。 这时候,如果你的cache规则定义的好, 那么只影响那么几毫秒。 但有规则的定义未必那么全面。 这时候就需要:使用SQL语句修改后台数据库之后,需要清空application的缓存,从而让hibernate到数据库中取到最新的 修改之后的值
   hibernate好像没有提供直接的清除cache的方法(我没找到)。所以使用下面的函数:
   sf 是 application中的sessionfactory。
   public static void evictSecondLevelCache() {
    Map<String, CollectionMetadata> roleMap = sf.getAllCollectionMetadata();
    for (String roleName : roleMap.keySet()) {
      sf.evictCollection(roleName);
    }

    Map<String, ClassMetadata> entityMap = sf.getAllClassMetadata();
    for (String entityName : entityMap.keySet()) {
      sf.evictEntity(entityName);
    }

    sf.evictQueries();
 }

示例:
Session session = sf.openSession();
  try {
   
   Query query = session.createQuery("from StockInfo where id = ?");
   query.setLong(0, 1800);
   query.setCacheable(true);
   query.list();
   session.close();
   
   evictSecondLevelCache();
   
   session = sf.openSession();
   query = session.createQuery("from StockInfo where id = ?");
   query.setLong(0, 1800);
   query.setCacheable(true);
   query.list();
  } catch (Exception ex) {
   log.info(ex.getMessage(), ex);
  }

就会在控制台中发现打印出两条SQL语句。 实际中可以把 evictSecondLevelCache();
放到一个单独的管理页面中。 叫“清除缓存”功能。 专门为 手动修改数据库 后的数据同步做准备。

分享到:
评论
2 楼 happyforever82 2009-03-30  
管理员呢, 我发了短信给你。 编辑的时候是好的, 保存之后显示就不行了
1 楼 happyforever82 2009-03-30  
为什么我的格式都乱了呢?、 内容也不全了啊。

相关推荐

    hibernate二级缓存实例

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

    Hibernate二级缓存

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

    hibernate 二级缓存详解

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

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

    为了解决这个问题,Hibernate引入了二级缓存。二级缓存是进程级或者集群级的,它可以跨多个会话和事务共享数据,从而进一步提高性能。二级缓存通常由第三方缓存提供商如Ehcache、Infinispan等实现。 一级缓存到二级...

    hibernate二级缓存示例源码

    综上所述,通过学习`hibernate二级缓存示例源码`,我们可以了解到如何在实际项目中配置和使用Hibernate二级缓存,从而提升系统的性能。在实际应用中,应结合具体场景选择合适的缓存策略,以达到最佳的性能优化效果。

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

    它是一个事务范围的缓存,也就是说,每个 Hibernate Session 对应一个一级缓存,仅在当前事务中有效。一级缓存主要存储了 Session 在当前事务中加载和修改的对象实例。当 Session 执行 CRUD 操作时,对象会自动放入...

    hibernate二级缓存

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

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

    在本文中,我们将深入探讨如何在Spring Boot 2.1.4.RELEASE项目中结合JPA(Java Persistence API)和Hibernate实现Redis作为二级缓存。首先,我们需要理解这些技术的基本概念。 Spring Boot 是一个用于简化Spring...

    hibernate二级缓存包

    在本压缩包“hibernate二级缓存包”中,重点包含的是 Ehcache 这个流行且广泛使用的二级缓存实现。 Ehcache 是一个开源的、高性能的缓存解决方案,它可以被集成到各种Java应用中,包括Hibernate框架。Ehcache 提供...

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

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

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

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

    Hibernate 二级缓存 总结整理

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

    Spring集成的Hibernate配置二级缓存

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

    hibernate二级缓存java包下载

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

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

    5. **实体类注解**:为了让Hibernate知道哪些实体类需要使用二级缓存,可以在实体类上添加`@Cacheable`注解,并指定缓存区域。例如: ```java @Entity @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) public...

    hibernate二级缓存所需要的 jar包

    在使用二级缓存时,需要确保这个库的版本与Ehcache集成库相匹配,以保证正常工作。 四、配置与使用 在实际项目中,要启用Hibernate的二级缓存,需要进行以下步骤: 1. 引入上述jar包到项目的类路径中。 2. 配置...

    Hibernate 二级缓存

    Hibernate 二级缓存

    Hibernate一级缓存和二级缓存

    Hibernate的一级缓存和二级缓存是提高数据访问效率的重要手段,它们各自承担着不同的角色,合理使用可以显著提升应用性能。然而,缓存的使用也需要谨慎,需要根据具体业务场景选择合适的缓存策略,并关注可能带来的...

    hibernate二级缓存要导入的包

    总之,使用这个压缩包提供的资源,开发者可以快速集成和配置Hibernate的二级缓存,实现高效的数据访问,提升应用性能。在实际开发中,要结合具体需求和环境,进行适当的选择和调整,以达到最佳效果。

    hibernate 二级缓存

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

Global site tag (gtag.js) - Google Analytics