`
siashuayongsheng
  • 浏览: 118025 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

Hibernate之缓存学习

阅读更多
对于Hibernate这类ORM而言,缓存显的尤为重要,它是持久层性能提升的关键.简单来讲Hibernate就是对JDBC进行封装,以实现内部状态的管理,OR关系的映射等,但随之带来的就是数据访问效率的降低,和性能的下降,而缓存就是弥补这一缺点的重要方法.

    缓存就是数据库数据在内存中的临时容器,包括数据库数据在内存中的临时拷贝,它位于数据库与数据库访问层中间.ORM在查询数据时首先会根据自身的缓存管理策略,在缓存中查找相关数据,如发现所需的数据,则直接将此数据作为结果加以利用,从而避免了数据库调用性能的开销.而相对内存操作而言,数据库调用是一个代价高昂的过程.

    一般来讲ORM中的缓存分为以下几类:

        1.事务级缓存:即在当前事务范围内的数据缓存.就Hibernate来讲,事务级缓存是基于Session的生命周期实现的,每个Session内部会存在一个数据缓存,它随着Session的创建而存在,随着Session的销毁而灭亡,因此也称为Session Level Cache.

        2.应用级缓存:即在某个应用中或应用中某个独立数据库访问子集中的共享缓存,此缓存可由多个事务共享(数据库事务或应用事务),事务之间的缓存共享策略与应用的事务隔离机制密切相关.在Hibernate中,应用级缓存由SessionFactory实现,所有由一个SessionFactory创建的Session实例共享此缓存,因此也称为SessionFactory Level Cache.

        3.分布式缓存:即在多个应用实例,多个JVM间共享的缓存策略.分布式缓存由多个应用级缓存实例组成,通过某种远程机制(RMI,JMS)实现各个缓存实例间的数据同步,任何一个实例的数据修改,将导致整个集群间的数据状态同步.

    Hibernate数据缓存:

        1.内部缓存(Session Level Cache也称一级缓存):

        举例说明:

java 代码
public class Test {   
  
      public void get(){    
  
            Session session = HibernateSessionFactory.getSession();   
            TUser t = (TUser)session.get("hibernate.TUser", 2);   
            System.out.println(t.getName());   
            session.close();   
            }   
  
}   
  

             进行测试:在控制台打印出一条SQL语句:Hibernate: select tuser0_.id as id0_0_, tuser0_.name as name0_0_, tuser0_.sex as sex0_0_ from test.t_user tuser0_ where tuser0_.id=? 说明进行了一次数据库的调用.

      代码更改如下:

public class Test {   
    
      public void get(){   
  
            Session session = HibernateSessionFactory.getSession();   
            TUser t = (TUser)session.get("hibernate.TUser", 2);   
            System.out.println(t.getName());   
            TUser tt = (TUser)session.get("hibernate.TUser", 2);   
            System.out.println(tt.getName());   
            session.close();   
  
      }   
  
}   
  

       再进行测试:进行了两次查询,控制台仍然只打出一条SQL语句:Hibernate: select tuser0_.id as id0_0_, tuser0_.name as name0_0_, tuser0_.sex as sex0_0_ from test.t_user tuser0_ where tuser0_.id=?  说明还是只进行了一次数据库的调用.

       再将代码更改如下:

public class Test {   
    
      public void get(){    
  
            Session session = HibernateSessionFactory.getSession();   
            TUser t = (TUser)session.get("hibernate.TUser", 2);   
            System.out.println(t.getName());   
            session.close();   
            Session session1 = HibernateSessionFactory.getSession();   
            TUser tt = (TUser)session1.get("hibernate.TUser", 2);   
            System.out.println(tt.getName());   
            session1.close();   
  
      }   
  
}   

       继续测试:进行两次查询控制台打印两条SQL语句:Hibernate: select tuser0_.id as id0_0_, tuser0_.name as name0_0_, tuser0_.sex as sex0_0_ from test.t_user tuser0_ where tuser0_.id=?
Hibernate: select tuser0_.id as id0_0_, tuser0_.name as name0_0_, tuser0_.sex as sex0_0_ from test.t_user tuser0_ where tuser0_.id=?

      结论:Hibernate进行查询时总是先在缓存中进行查询,如缓存中没有所需数据才进行数据库的查询.Hibernate的内部缓存是基于Session的生命周期的,也就是说存在于每个Session内部,它随着Session的创建而存在,随着Session的销毁而灭亡,内部缓存一般由Hibernate自动维护,不需要人为干预,当然我们也可以根据需要进行相应操作:Session.evict(Object)(将指定对象从内部缓存清除),Session.clear()(清空内部缓存).(如在两次查询间加入Session.clear()将会清空内部缓存,使得一个Sesion内部的两次相同的查询要对数据库进行两次操作).

      2.二级缓存:(有时称为SessionFactory Level Cache)

      Hibernate本身并未提供二级缓存的产品化实现(只提供了一个基于HashTable的简单缓存以供调试),这里我使用的是第三方缓存组件:EHcache.Hibernate的二级缓存实现需要进行以下配置(Hibernate3):

      首先在hibernate.cfg.xml内添加:



<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>  
<property name="hibernate.cache.use_query_cache">true</property>  

然后在映射文件中添加:
<cache usage="read-only"/>  

            测试上面代码:控制台输出多了这样一句[ WARN] (CacheFactory.java:43) - read-only cache configured for mutable class: hibernate.TUser,二级缓存启用成功!!      

java 代码
public class Test {   
    
      public void executeQuery(){   
     
            List list = new ArrayList();   
            Session session = HibernateSessionFactory.getSession();   
            Query query = session.createQuery("from TUser t");   
            query.setCacheable(true);//激活查询缓存   
            list = query.list();   
            session.close();   
  
      }   
      public void get(){   
  
            Session session = HibernateSessionFactory.getSession();   
            TUser t = (TUser)session.get("hibernate.TUser", 2);   
            System.out.println(t.getName());   
            session.close();   
  
     }   
  
}   

      测试:控制台只输出一条SQL语句:Hibernate: select tuser0_.id as id0_, tuser0_.name as name0_, tuser0_.sex as sex0_ from test.t_user tuser0_(即Query query = session.createQuery("from TUser t")这句代码所对应的SQL).  executeQuery()方法与get()方法使用的是不同的Session!!可是executeQuery()方法与get()方法只对数据库进行了一次操作,这就是二级缓存在起作用了.  

      结论:Hibernate二级缓存是SessionFactory级的缓存,它允许多个Session间共享,使用时需要使用第三方的缓存组件,新版Hibernate将EHcache作为默认的二级缓存实现.

      缓存同步策略:缓存同步策略决定了数据对象在缓存中的存取规则,我们必须为每个实体类指定相应的缓存同步策略.Hibernate中提供了4种不同的缓存同步策略:(暂时只记个概念吧)

      1.read-only:只读.对于不会发生改变的数据可使用.

      2.nonstrict-read-write:如果程序对并发访问下的数据同步要求不严格,且数据更新频率较低,采用本缓存同步策略可获得较好性能.

      3.read-write:严格的读写缓存.基于时间戳判定机制,实现了"read committed"事务隔离等级.用于对数据同步要求的情况,但不支持分布式缓存,实际应用中使用最多的缓存同步策略.

      4.transactional:事务型缓存,必须运行在JTA事务环境中.此缓存中,缓存的相关操作被添加到事务中(此缓存类似于一个内存数据库),如事务失败,则缓冲池的数据会一同回滚到事务的开始之前的状态.事务型缓存实现了"Repeatable read"事务隔离等级,有效保证了数据的合法性,适应于对关键数据的缓存,Hibernate内置缓存中,只有JBossCache支持事务型缓存.
分享到:
评论

相关推荐

    hibernate二级缓存示例源码

    呈现了hibernate二级缓存 的基本用法 相信可参照相关文档 来学习

    Hibernate二级缓存配置与分析

    学习hibernate的必备,提供一个简易的流程图,方便记忆和查找

    域模型的种状态与hibernate缓存PPT学习教案.pptx

    域模型的种状态与hibernate缓存PPT学习教案.pptx

    Hibernate学习笔记和资料

    hibernate概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置实体规则,核心API详解(Configuration,sessionFactory,session,Transaction),hibernate中的对象状态以及刷新能缓存机制 ...

    Hibernate缓存深入详解

    非常好的学习Hibernate 资料。探讨Hibernate 缓存机制深入浅出,适合有一定开发经验的人作为学习和参考资料。

    Hibernate缓存

    学习hibernate,缓存很重要,此文档包含了一级缓存和二级缓存以及细致的配置

    hibernate基础学习资料

    Java框架中关于hibernate的基础学习

    hibernate 缓存

    学习hibernate缓存的好资料,内容详尽、具体!

    Hibernate学习笔记

    Hibernate 学习笔记 get和load的区别 一对一,一对多,多对多 悲观锁,乐观锁 hibernate查询语言hql hibernate一级缓存、二级缓存 抓取策略

    Hibernate缓存深入详解.ppt

    Hibernate缓存深入详解,是一个学习了解hibernate工作原理的PPT讲义。

    hibernate学习文档

    hibernate 学习资料 Session接口 Query和Criteria接口 Hibernate主键介绍 二级缓存的管理

    hibernate以及连接池

    hibernate的学习资料,以及连接池和二级缓存

    马士兵hibernate学习笔记(原版)

    目录 课程内容 1 HelloWorld 2 Hibernate原理模拟 - 什么是O/R Mapping以及为什么... 4 一级缓存和二级缓存和査询缓存(面试题)(详见hibernate_3000_Hibernate_3KindsOf_Cache) 5 事务并发处理(面试的意义更大)

    Hibernate中文详细学习文档

    3.4.4. 二级缓存与查询缓存 3.4.5. 查询语言中的替换 3.4.6. Hibernate的统计(statistics)机制 3.5. 日志 3.6. 实现NamingStrategy 3.7. XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 ...

    hibernate学习笔记

    Hibernate 学习笔记 Hibernate 学习笔记 1 第一个hibernate项目(hibernate_first) 2 测试实体对象的生命周期(hibernate_session) 3 hibernate基本映射(hibernate_basemapping) 4 class实体类---表 4 标签id 5 ...

    Hibernate4学习基础教程(26集)

    内容涵盖安装 Hibernatetools 插件、Session 核心方法、持久化对象生命周期、对象关系映射、检索策略、检索方式、Hibernate 一\二级缓存、管理 Session、批量处理等 Hibernate 企业级开发的核心技术。

    spring hibernate 事务管理学习笔记(二)

    NULL 博文链接:https://microjava.iteye.com/blog/525981

    详细解读Hibernate的缓存机制

    主要介绍了详细解读Hibernate的缓存机制,具有一定参考价值,这里分享给大家,供大家学习参阅。

    08.拓薪教育-hibernate4.3的hibernate.cfg.xml基本配置.part2

    高级Hibernate4开发技术:ORM思想,hibernate介绍,hibernate.cfg.xml配置,hbm.xml映射文件详解,主键生成策略使用,PO对象状态及状态的转换分析、一级缓存,Hibernate数据检索技术,Hibernate高级映射技术,...

Global site tag (gtag.js) - Google Analytics