Hibernate的一级缓存Session和二级缓存SessionFactory

来源:互联网 发布:逆矩阵公式运算公式 编辑:程序博客网 时间:2024/05/20 12:49

Hibernate的一级缓存是指Session(属于事务范围的缓存,由Hibernate管理,无需干预),它是一块内存空间,用来存放相互管理的java对象,有了一级缓存,应用程序可以减少访问数据库的次数,提高了性能。

在使用Hibernate查询对象的时候,首先会使用对象属性的OID值(对应表中的主键)在Hibernate的一级缓存进行查找,如果找到,则取出返回,不会再查询数据库,如果没有找到,再到数据库中进行查询操作。然后将查询结果存放到Session一级缓存中。

特点:

  • 进行save()、update()、saveOrUpdate()操作的时候会把相应的对象那个存放在session缓存中(注意,save()和update()并不是直接反应到数据库中,而是反应到session中,当事务进行提交的时候,session会进行刷出操作,将session中对象的变化反映到数据库中)
  • 调用get()、load()的时候或其他进行查询的方法,会现在session中查找,若有返回,若无,查询数据库,然后把结果保存在session中
  • 当调用session的close()的时候,一级缓存清空
  • Session会在某些时间点,按照缓存中对象的变化进行数据库的同步,如下几种时间:
    (1)当应用程序调用Transaction的commit()方法时,该方法先刷出缓存,然后再向数据库提交事务
    (2)当应用程序执行一些查询操作时,如果缓存中持久化对象的属性已经发生了变化,会先刷出缓存,保证同步
    (3)手动执行session.flush()

Hibernate是如何实现一级缓存的呢?
这是依赖了Hibernate快照来实现的,其实session与数据库数据的对比并不是真正的对比,session不是和数据库的数据做对比,而是和Hibernate快照做对比,但这个快照永远和数据库的数据保持一致。

Hibernate向以及缓存放入数据时,同时赋值一份数据放入到Hibernate快照中,当使用commit()方法提交事务时,同时会清理Session的一级缓存(flush操作,之后session清空),这是会使用OID判断以及缓存中的对象和快照中的对象是否一致,如果两个对象中的属性发生变化,则执行update语句,将缓存的内容同步到数据库中,并更新快照(从这里可以知道数据库和快照保持一致);如果一致,则不执行update语句。Hibernate快照的作用就是确保一级缓存中的数据和数据库中的数据一致。

一级缓存的3个操作:

  • flush():同步后清空
  • clear():只是清空一级缓存,并不会进行同步操作(session.evict(book):只对session中的某个对象进行清理操作)
  • refresh():刷新操作,在refresh()操作前,程序员可以对从数据库获取的对象进行属性修改,但是refresh()执行后,这些对象的属性恢复原来的样子。即:refresh()的作用是:使Hibernate快照区和一级缓存中的数据域数据库保持一致。

Hibernate的二级缓存是SessionFactory,属于进程范围的缓存。
SessionFactory的缓存分为两类:

  • 内置缓存
    Hibernate自带,不可卸载。在Hibernate的初始化阶段,Hibernate会把映射元数据(映射文件中数据的赋值)和预定义的SQL语句放到SessionFactory的缓存中。该内置缓存是只读的。
  • 外置缓存
    可配置的缓存插件。默认不会开启,缓存可以是内存也可以是硬盘
    具体可参考传智博客的《SSH》。
    其实我们上面说的Session找不到对应的对象就去数据库中找是不太正确的,Session找不到会去二级缓存SessionFactory找(如果配置了二级缓存的话),参考《SSH》的P204-P206,有例子说明
0 0
原创粉丝点击