首页 > Web开发 > 详细

Hibernate5-课程笔记7

时间:2017-01-17 00:36:46      阅读:315      评论:0      收藏:0      [点我收藏+]

Hibernate缓存机制:

  缓存范围:

    应用程序中根据缓存的范围,可以将缓存分为三类: 

     (1)事务范围缓存(单Session,即一级缓存)
      事务范围的缓存只能被当前事务访问,每个事务都有各自的缓存。缓存的生命周期依赖于事务的生命周期:当事务结束时,缓存的生命周期也会结束。事务范围的缓存使用内存作为存储介质。Hibernate中的一级缓存就属于事务范围。

     (2)应用范围缓存(单SessionFactory,即二级缓存)
      应用范围的缓存可以被应用程序内的所有事务共享访问。缓存的生命周期依赖于应用的生命周期,当应用结束时,缓存的生命周期同时结束。应用范围的缓存可以使用内存或硬盘作为存储介质。Hibernate的二级缓存就属于应用范围。 

     (3)集群范围缓存(多SessionFactory)
      在集群环境中,缓存被一个机器或多个机器的进程共享,缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓存中的数据的一致性,缓存中的数据通常采用对象的松散数据形式。有些Hibernate的二级缓存第三方插件支持集群范围缓存。

   (1) 一级缓存:

      一级缓存,就是Session缓存,其实就是内存中的一块空间,在这个内存空间存放了相互关联的Java对象。Session缓存是事务级缓存。伴随着事务的开启而开启,伴随着事务的关闭而关闭。Session缓存由Hibernate进行管理。Session缓存,是Hibernate内置的。是不能被程序员取消的。即,只要使用Hibernate,就一定要使用,更确切地说,就一定在使用Session缓存
      当程序调用Session的load()方法、get()方法、save()方法、saveOrUpdate()方法、update()方法或查询接口方法时,Hibernate会对实体对象进行缓存。当通过load()或get()方法查询实体对象时,Hibernate会首先到缓存中查询,在找不到实体对象的情况下,Hibernate才会发出SQL语句到DB中查询。从而提高了Hibernate的使用效率。

      一级缓存相关的方法:

        evict(Object o):从Session中删除指定对象

        clear():无参数,将Session缓存清空

        contains(Object o):判断指定对象是否在Session中存在

        flush():无参数,将Session中对象状态同步到DB中

      快照(引用自北京动力节点):

        技术分享

        代码说明:

 1 @Test
 2 public void test01_SQL() {
 3     //1. 获取Session
 4     Session session = HbnUtils.getSession();
 5     try {
 6         //2. 开启事务
 7         session.beginTransaction();
 8         //3. 操作
 9         //session.get的时候,hibernate就将数据库中的数据加载到session缓存中,同时也会备份到快照中
10         Student student = session.get(Student.class, 2);
11         student.setName("n_2");
12         session.update(student);
13         //4. 事务提交
14         //commit是唯一的同步时间点,当程序运行到同步时间点时,
15         //hibernate先判断session缓存中的数据和快照中的数据是否相同,
16         //如果不相同,则更新数据库,如果相同,则不更新数据库,
17         //以上,两种情况,无论是否写了update,都成立
18         session.getTransaction().commit();
19     } catch (Exception e) {
20         e.printStackTrace();
21         //5. 事务回滚
22         session.getTransaction().rollback();
23     }
24 }

     Session的刷新与同步:

      Session的刷新是指,Session缓存中的数据的更新。Session的同步是指,将Session缓存中的数据同步更新到DB中。执行同步的时间点只有一个:事务的提交

      当代码中执行了对Session中现有数据的修改操作,即update()与delete()语句后,Session缓存并不会马上刷新,即并不会马上执行update与delete的SQL语句,而是在某个时间点到来时,才会刷新缓存,更新缓存中的数据。刷新的时间点主要有三个:

        (1)执行Query查询

        (2)执行session.flush()

        (3)执行事务的提交

      通过Session的setFlushMode()方法,可以设置缓存刷新模式:

      技术分享

      注意:增删改操作,当刷新时间点到来时是否马上进行缓存更新,各自情况还是不同的。

        删除操作,一到达刷新时间点,马上执行delete语句,更新Session中数据;

        更新操作,到达刷新时间点后,是否马上执行update语句,更新Session中数据,还要看该修改内容是否与快照一致若一致,则执行,否则,则不执行;

        插入操作,无需等到刷新时间点的到达,见到save()后马上执行insert语句。因为插入操作不是修改Session中已经的存在数据,而是给Session中添加数据。

        

   (2) 二级缓存:

      二级缓存是SessionFactory级的缓存,其生命周期与SessionFactory一致。SessionFactory缓存可以依据功能和目的的不同而划分为内置缓存和外置缓存。 
      SessionFactory的内置缓存中存放了映射元数据和预定义SQL语句映射元数据是映射文件中数据的副本,而预定义SQL语句是在Hibernate初始化阶段根据映射元数据推导出来的SQL。SessionFactory的内置缓存是只读的应用程序不能修改缓存中的映射元数据和预定义SQL语句,因此SessionFactory不需要进行内置缓存与映射文件的同步。
      SessionFactory的外置缓存一个可配置的插件。在默认情况下,SessionFactory不会启用这个插件。外置缓存的数据是数据库数据的副本外置缓存的介质可以是内存或者硬盘。SessionFactory的外置缓存也被称为Hibernate的二级缓存
Hibernate本身只提供了二级缓存的规范,但并未实现,故需要第三方缓存产品的支持。常用的二级缓存第三方插件有: 
        EHCache、Memcached、OSCache、SwarmCache、JBossCache等。这些插件的功能各有侧重,各有特点。

        技术分享

 

Hibernate5-课程笔记7

原文:http://www.cnblogs.com/qjjazry/p/6291466.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!