`

Hibernate二级缓存【转】新理解

 
阅读更多

二级缓存 也称为进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享。二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存。

二级缓存是由不同的提供商提供,默认情况下,Hibernate使用EHCache进行JVM级别的缓存。
缓存策略提供商如下表:

Cache Provider class Type Cluster Safe Query Cache Supported
Hashtable (not intended for production use) org.hibernate.cache.HashtableCacheProvider memory yes
EHCache org.hibernate.cache.EhCacheProvider memory, disk yes
OSCache org.hibernate.cache.OSCacheProvider memory, disk yes
SwarmCache org.hibernate.cache.SwarmCacheProvider clustered (ip multicast) yes (clustered invalidation)
JBoss TreeCache org.hibernate.cache.TreeCacheProvider clustered (ip multicast), transactional yes (replication) yes (clock sync req.)


EHCache是不支持集群的。

下面以EHCache为例说明二级缓存的配置和使用:
(1)将echache.xml文件拷贝到相应的目录下。
(2)开启二级缓存,修改hibernate.cfg.xml文件
<property name= "hibernate.cache.use_second_level_cache" > true </property>
(3)指定缓存产品提供商,修改hibernate.cfg.xml文件
<property name= "hibernate.cache.provider_class" > org.hibernate.cache.EhCacheProvider </property>
(4)指定哪些实体使用二级缓存(两种方法)
    *在实体映射文件中采用<cache>标签
      <cache
usage= "transactional|read-write|nonstrict-read-write|read-only" (1)
        region= "RegionName"                                               (2)
   include= "all|non-lazy"                                            (3)
       />

(1)

usage (必须)说明了缓存的策略: transactionalread-writenonstrict-read-writeread-only

(2)

region (可选, 默认为类或者集合的名字(class or collection role name)) 指定第二级缓存的区域名(name of the second level cache region)

(3)

include (可选,默认为 all ) non-lazy 当属性级延迟抓取打开时, 标记为lazy="true" 的实体的属性可能无法被缓存


如:         <cache usage= "read-only" />
    *在hibernate.cfg.xml文件中,采用<class-cache>标签
         <class-cache class= "com.Student" usage= "read-only" />
    
建议使用这种方法,因为这样就能知道整个项目中哪些实体使用了二级缓存,很一目发然。

这里usage 属性指明了缓存并发策略(cache concurrency strategy)
    *只读缓存(Strategy: read only)
     如果你的应用程序只需读取一个持久化类的实例,而无需对其修改, 那么就可以对其进行只读 缓存。这是最简单,也是实用性最好的方法。甚至在集群中,它也能完美地运作。

    *读/写缓存(Strategy: read/write)
     如果应用程序需要更新数据,那么使用读/写缓存 比较合适。 如果应用程序要求“序列化事务”的隔离级别(serializable transaction isolation level),那么就决不能使用这种缓存策略。 如果在JTA环境中使用缓存,你必须指定hibernate.transaction.manager_lookup_class属性的值, 通过它,Hibernate才能知道该应用程序中JTA的TransactionManager的具体策略。 在其它环境中,你必须保证在Session.close()、或Session.disconnect()调用前, 整个事务已经结束。 如果你想在集群环境中使用此策略,你必须保证底层的缓存实现支持锁定(locking)。Hibernate内置的缓存策略并不支持锁定功能。
<class name= "eg.Cat" .... >
    <cache usage= "read-write" />
    ....
    <set name= "kittens" ... >
        <cache usage= "read-write" />
        ....
    </set>
</class>

   
*非严格读/写缓存(Strategy: nonstrict read/write)
    如果应用程序只偶尔需要更新数据(也就是说,两个事务同时更新同一记录的情况很不常见),也不需要十分严格的事务隔离, 那么比较适合使用非严格读/写缓存策略。如果在JTA环境中使用该策略, 你必须为其指定hibernate.transaction.manager_lookup_class属性的值, 在其它环境中,你必须保证在Session.close()、或Session.disconnect()调用前, 整个事务已经结束。

   *事务缓存(transactional)
    Hibernate的事务缓存策略提供了全事务的缓存支持, 例如对JBoss TreeCache的支持。这样的缓存只能用于JTA环境中,你必须指定为其hibernate.transaction.manager_lookup_class属性。

没有一种缓存提供商能够支持上列的所有缓存并发策略。下表中列出了各种提供器、及其各自适用的并发策略。

Cache read-only nonstrict-read-write read-write transactional
Hashtable (not intended for production use) yes yes yes
EHCache yes yes yes
OSCache yes yes yes
SwarmCache yes yes
JBoss TreeCache yes yes



下面写了一个测试类,一个方法中两次开启session,查询同一条记录:
public void testLoad1 (){
    Session session = null ;
    try {
        session = HibernateUtils . getSession ();
        session . beginTransaction ();
           
        Student s = (Student )session . load (Student . class , 1 );
        System . out . println ("student.name=" + s. getName ());
           
        session . beginTransaction (). commit ();
    } catch (Exception e ){
        e . printStackTrace ();
        session . beginTransaction (). rollback ();
    }
    finally {
        HibernateUtils . closeSession (session );
    }
       
    try {
        session = HibernateUtils . getSession ();
        session . beginTransaction ();
           
        Student s = (Student )session . load (Student . class , 1 );
        System . out . println ("student.name=" + s. getName ());
           
        session . beginTransaction (). commit ();
    } catch (Exception e ){
        e . printStackTrace ();
        session . beginTransaction (). rollback ();
    }
    finally {
        HibernateUtils . closeSession (session );
    }
}

执行结果:
21:38:27,703 WARN CacheFactory:43 - read-only cache configured for mutable class: com.Student
21:38:27,718 WARN EhCacheProvider:86 - Could not find configuration [com.Student]; using defaults.
Hibernate: select student0_.id as id0_0_, student0_.name as name0_0_, student0_.classesid as classesid0_0_ from Student student0_ where student0_.id=?
student.name=aa
student.name=aa

只查询一次数据库,在跨session的操作中,由于开启了二级缓存,第二次session查询时,只要在缓存中查询就行,不用再去查询数据库。

对于二级缓存来说,在SessionFactory 中定义了许多方法, 清除缓存中实例、整个类、集合实例或者整个集合,来管理二级缓存。
sessionFactory . evict (Cat . class , catId ); //evict a particular Cat
sessionFactory . evict (Cat . class ); //evict all Cats
sessionFactory . evictCollection ("Cat.kittens" , catId ); //evict a particular collection of kittens
sessionFactory . evictCollection ("Cat.kittens" ); //evict all kitten collections

CacheMode 参数用于控制具体的Session如何与二级缓存进行交互。

  • CacheMode.NORMAL - 从二级缓存中读、写数据。

  • CacheMode.GET - 从二级缓存中读取数据,仅在数据更新时对二级缓存写数据。

  • CacheMode.PUT - 仅向二级缓存写数据,但不从二级缓存中读数据。

  • CacheMode.REFRESH - 仅向二级缓存写数据,但不从二级缓存中读数据。通过 hibernate.cache.use_minimal_puts 的设置,强制二级缓存从数据库中读取数据,刷新缓存内容。

分享到:
评论

相关推荐

    hibernate二级缓存实例

    总的来说,"hibernate二级缓存实例"是一个很好的学习资源,它可以帮助我们理解二级缓存的工作机制,掌握如何在项目中配置和使用,以及注意潜在的问题和优化策略。通过实践,我们可以更好地运用这一技术,提升Java...

    hibernate二级缓存示例源码

    通过分析这些源码,我们可以更深入地理解Hibernate二级缓存的工作流程和实际应用。 ### 6. 注意事项 - 虽然二级缓存提高了效率,但过度依赖可能会导致数据一致性问题。因此,需要根据业务需求谨慎选择缓存策略。 -...

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

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

    Hibernate一级缓存和二级缓存

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

    hibernate二级缓存java包下载

    Hibernate 是一个非常流行的开源对象关系映射(ORM)框架,它允许 Java 开发人员将数据库操作转换...通过学习这些内容,开发者可以更好地理解并掌握如何在实际项目中有效利用 Hibernate 的二级缓存功能,提升系统性能。

    Hibernate 二级缓存 总结整理

    通过理解和运用Hibernate的二级缓存,我们可以优化应用性能,减少数据库压力,但同时也需要注意缓存可能带来的问题,如数据一致性、内存管理和并发控制等。在实际项目中,结合业务需求和系统特点,合理配置和管理...

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

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

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

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

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

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

    hibernate二级缓存(包括注解方式)

    标题“hibernate二级缓存(包括注解方式)”指出了本文将探讨的是Hibernate框架中的二级缓存机制,并且会涉及使用注解的方式进行配置。Hibernate是一个流行的对象关系映射(ORM)框架,它允许开发者在Java应用中使用...

    Hibernate4二级缓存实例(源码)

    这里它被用作Hibernate二级缓存的实现方式,这意味着当数据首次从数据库中读取后,会被存储在memcached中,后续请求可以直接从缓存中获取,避免了频繁的数据库交互,从而提高了系统的响应速度。 **知识点详解:** ...

    hibernate二级缓存 SSH

    在这个项目中,"hibernate二级缓存 SSH" 的标题表明我们将探讨如何在SSH框架中实现Hibernate的二级缓存功能。Hibernate二级缓存是一个优化策略,它能提高数据访问性能,减少对数据库的直接访问。 首先,Struts2作为...

    hibernate二级缓存

    在深入探讨Hibernate二级缓存之前,我们首先需要理解Hibernate缓存机制的基本概念。Hibernate作为一款优秀的对象关系映射(ORM)框架,它提供了一种在Java应用与数据库之间进行对象到关系表转换的方式,简化了数据...

    hibernate的一级缓存和二级缓存

    《深入理解Hibernate的一级缓存与二级缓存》 Hibernate作为一款强大的ORM框架,其缓存机制是优化数据库操作性能的关键之一。缓存主要分为一级缓存和二级缓存,它们各自承担着不同的职责,共同提升了数据访问的效率...

    Hibernate二级缓存+分页功能

    **一、Hibernate二级缓存** Hibernate一级缓存是指Session级别的缓存,它是默认开启的,每个Session都会维护一个对象缓存,用来存放该Session加载的实体对象。一级缓存的生命周期与Session相同,当Session关闭时,...

    Hibernate二级缓存实例带jar包

    在Java的持久化框架Hibernate中,二级缓存是一个重要的性能优化工具。它允许应用程序存储已经查询过的数据,以便后续请求可以快速获取,而无需再次访问数据库。本实例着重讲解如何在Hibernate项目中配置和使用二级...

    Hibernate二级缓存

    总之,Hibernate二级缓存是提升系统性能的重要手段,但正确配置和管理缓存至关重要。理解其工作原理,根据业务场景选择合适的缓存策略,才能最大化发挥其优势。在实际应用中,还需结合数据库设计、索引优化等多方面...

    Hibernate二级缓存架包.rar

    《深入理解Hibernate二级缓存:基于给定的配置与组件》 在Java的持久化框架领域,Hibernate无疑是最为广泛使用的工具之一。它提供了一种高效、便捷的方式来管理数据库对象,而其中的二级缓存机制则进一步提升了性能...

Global site tag (gtag.js) - Google Analytics