`

hibernate 二级缓存(一)

阅读更多

一。

1 Hibernate 二级缓存也称之为进程级或 SessionFactory 级缓存。

 

2 生命周期:

SessionFactory 生命周期一致。

 

3 缓存类型:

只缓存对象实体,不缓存普通属性。

 

4 缓存范围:

可被所有 session 共享。

 

5 缓存配置:

需要 ehcache.jar (第 3 方缓存产品)和 ehcache.xml ehcache 不支持分布式缓存。

 

6. 缓存管理:

       SessionFactory 可以直接对二级缓存进行管理。

           // 清空二级缓存中某个对象的所有数据

           evict( 类名 . class );

           // 清空二级缓存中某个对象某一列的数据

           evict( 类名 . class , id);

 

7 优点:

减小(少)数据库压力以及访问次数。

 

8 缺点:

不易缓存经常变更的数据,因为数据库数据发生改变时缓存内的数据 不能及时 同步。二级缓存的 / 写缓存策略虽然支持数据库和缓存数据同步,但效率不高:

缓存经常变更的数据虽降低数据库的访问次数,但长时间持续缓存这些数据却增加了 Hibernate 本身的压力和数据库的任务量:

01.    更新数据库数据。

02.    同步对象锁,避免其他事务访问。

03.    更新缓存内记录。

采用缓存其实就是利用缓存消亡前的时间差的间隙来获取数据,即可缓解数据库的访问次数和压力,但对于读写策略来说却降低了效率。

 

9 开启二级缓存:在 Hibernate 配置文件利添加:

< property name = "hibernate.cache.use_second_level_cache" >

true

</ property >

 

10 指定缓存提供商:

< property name = "hibernate.cache.provider_class" >

org.hibernate.cache.EhCacheProvider

</ property >

 

11. 缓存策略:

只读缓存( read only ):当数据库数据发生改变时,缓存内的数据不会和数据库同步 , 一般推荐使用只读缓存(缓存消亡后仍重新更新数据)。

      Hibernate 配置文件 <mapping/> 标签后配置:

< class-cache class = " 包名 . 类名 " usage = "read-only" />

 

/ 写缓存( read/write ):

当数据库数据发生改变时,缓存内的数据可以和数据库同步 , 一般不建议使用。原因就在于会带给 Hibernate 很大的压力和数据库大任务量。

Hibernate 配置文件 <mapping/> 标签后配置:

< class-cache class = " 包名 . 类名 " usage = "read-write" />

 

    如果是在 cfg 里面配置缓存策略,那么必须在 <mapping/> 标签后配置, hbm <id/> 属性标签前配置。

 

12. ehcache.xml 配置文件信息:

                  <!-- 内存不足时,磁盘缓存目录 -->

                  < diskStore path = "c:/WINDOWS" />

                  < defaultCache

            <!-- 缓存中最大允许创建的对象数 -->

           maxElementsInMemory = "10000"

           <!-- 缓存中对象是否为永久的,如果是,缓存将不消亡 -->

           eternal = "false"

           <!-- 缓存数据钝化时间 ( 设置缓存在消亡之前的空闲时间 )-->

           timeToIdleSeconds = "120"

           <!-- 缓存数据的生存时间 ( 设置缓存超过这个时间就消亡 )-->

           timeToLiveSeconds = "120"

             <!-- 内存不足时,是否启用磁盘缓存 -->

           overflowToDisk = "true"

        />

 

13. 一级缓存和二级缓存交互:

    session 关闭后,一级缓存也就消亡了,这个时候如果二级缓存已开启,那么就会从二   级缓存里面获取数据,而不会重新访问数据库来获取。

    Hibernate 配置文件信息里,添加对二级缓存的支持:

       <!-- 启动二级缓存 -->

        < property name = "hibernate.cache.use_second_level_cache" >

            true

       </ property >

       <!-- 指定缓存提供商 -->

       < property name = "hibernate.cache.provider_class" >

           org.hibernate.cache.EhCacheProvider

       </ property >

       < mapping resource = "com/bean/User.hbm.xml" />

       <!-- 采用只读策略 -->

       < class-cache class = "com.bean.User" usage = "read-only" />

 

缓存交互代码:

    public void testGet()

    {

       Session session = null ; // 声明 Session 接口

       try

       {

           // 打开 session

           session = Hibernate_Utils.getFactory ().openSession();                

           session.beginTransaction(); // 打开事务

           Query query = session.createQuery( "select u from User u where u.id = '1'" );

           List list = query.list();

           Iterator iter = list.iterator();

           while (iter.hasNext())

           {

              User user = (User)iter.next();

              System. out .println( " 数据库数据: " + user.getName());

           }

           // 加载 session get 方法

           User user = (User)session.get(User. class , 1);

           System. out .println( " 一级缓存数据: " + user.getName());

           session.getTransaction().commit(); // 提交事务

       }

       catch (Exception e)

       {

           e.printStackTrace();

           session.getTransaction().rollback(); // 回滚事务

           return ;

       }

       finally

       {

           if (session != null )

           {

              session.close(); // 结束资源

           }

       }

       try

       {

           // 打开 session

           session = Hibernate_Utils.getFactory ().openSession();                

           session.beginTransaction(); // 打开事务

           // 加载 session load 方法

           User user = (User)session.load(User. class , 1);

           System. out .println( " 二级缓存数据: " + user.getName());

           session.getTransaction().commit(); // 提交事务

       }

       catch (Exception e)

       {

           e.printStackTrace();

           session.getTransaction().rollback(); // 回滚事务

           return ;

       }

       finally

       {

           if (session != null )

           {

              session.close(); // 结束资源

           }

       }

    }   

上面采用的缓存策略是 read-only (只读) , 只读策略是不允许对数据库数据进行修改(非手动修改数据库数据)也不会和数据库数据同步(只有缓存消亡后会重新获取数据),否则会抛出 java.lang.UnsupportedOperationException 异常。

采用 read-write (读写)策略也是不允许手动修改数据库数据的,否则是看不见效果的。

 

二。

缓存( Cache ), 往往是提高系统性能的重要手段。对数据起到一个蓄水池和缓冲的的作用。缓存对于大量依赖数据读取操作的系统而言尤为重要,在大并发量的情况下,如果每次程 序都需要向数据库直接做查询操作,所带来的性能开销显而易见。频繁的网络传输、数据库磁盘的读写操作,这些都大大降低了系统的整体性能。此时,如果能把数 据在本地内存中保留一个镜像,下次访问时只需从内存中直接获取,那么显然可以带来显著的性能提升。引入缓存机制的难点是如何保证内存中数据的有效性,否则 脏数据的出现将给系统带来难以预知的严重后果。虽然一个设计很好的应用程序不用缓存也可以表现出让人接受的性能,但毫无疑问,一些对读操作要求很高的应用 程序可以通过缓存取得更高的性能。对于应用程序,缓存通过内存或磁盘保存了数据库的当前有关数据状态,它是一个存于当地的数据备份。缓存位于数据库和应用 程序之间,从数据库更新数据,并给程序提供数据。

 

 Hibernate 的一级缓存是会话级缓存(Session-level),也就是常用到的Session,会话级缓存在给定的Session实例的生命周期内保存对象的实 例。Session缓存类似于事务性缓存,只缓存给定的操作所需数据。二级缓存是应用级缓存(缓存服务).

 

 Hibernate支持四种缓存服务,EHCache(Easy Hibernate Cache)是默认服务。要使用其他的缓存服务(二级缓存)需要在hibernate.cfg.xml中配置。例:

   <propertyname="hibernate.cache.provider_class">

      org.hibernate.cache.OSCacheProvider

   </property>
 

 

 Hibernate提供的缓存支持

 

     EHCache      (org.hibernate.cache.EhCacheProvider)

是一个简单,高效,使用简单的轻量级的缓存,它支持只读.读写.内存硬盘缓存。但并不支持分布式。     

             OSCache      (org.hibernate.cache.OSCacheProvider)

另一个开源缓存解决方案,他一是一个更大计划的一个部分,这个部分就是为JSP或者任意对象提供。像EHCache一样也是强大和灵活的包。它支持只读.读写.内存硬盘缓存。它也提供基本的JavaGroup或者JMS的集群支持

           SwarmCache    (org.hibernate.cache.SwarmCacheProvider)

一个简单的基于JavaGroups集群基本解决方案,他支持只读或者非严格读写。更多的用于读炒作。

            TreeCache      (org.hibernate.cache.TreeCacheProvider)

             JBOSS提供,一个强大的同步或非同步的事务缓存.

                            

缓存插件

transactional

read-write

nonstrict-read-write

read-only

EhCache

不支持

支持

支持

支持

SwarmCache

不支持

不支持

支持

支持

TreeCache

支持

不支持

不支持

支持

OSCache

不支持

支持

支持

支持

        

 

  缓存配置文件属性:

 

 拷贝 ehcache.xml 文件到类路径下。 ehcache.xml 文件位于 Hibernate 安装目录 etc 下,拷贝这文件到项目工程的 src 目录下。

 

  l <diskStore p

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

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

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

    hibernate二级缓存实例

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

    Hibernate二级缓存

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

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

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

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

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

    hibernate 二级缓存详解

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

    hibernate二级缓存示例源码

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

    Hibernate一级缓存和二级缓存

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

    hibernate二级缓存包

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

    Hibernate 二级缓存

    Hibernate 二级缓存

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

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

    hibernate二级缓存java包下载

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

    Hibernate 二级缓存 总结整理

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

    Hibernate 一级缓存和二级缓存的区别

    Hibernate 一级缓存和二级缓存的区别

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

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

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

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

    Spring集成的Hibernate配置二级缓存

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

    hibernate二级缓存所需要的 jar包

    一、Hibernate二级缓存概念 Hibernate的一级缓存是指Session级别的缓存,每个Session内部都有一个一级缓存,用于存储实体对象,当Session关闭时,一级缓存中的数据也会被清除。而二级缓存则是一个SessionFactory级别...

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

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

Global site tag (gtag.js) - Google Analytics