Hibernate缓存

来源:互联网 发布:php kahlan 编辑:程序博客网 时间:2024/06/06 23:04

  Hibernate有二级缓存结构。session缓存是内置的,被称为Hibernate的以及缓存;SessionFactory的外置缓存是可以插拔的缓存插件,它被称为Hibernate的二级缓存。Hibernate使用缓存策略去实现持久化对象和数据库的同步更新,并且缓存可以在很大程度上提升查询速度。

  1. 缓存的基本原理
      缓存的概念在计算机领域非常常见,它介于应用程序和永久性数据(如硬盘文件、数据库)之间。它可以降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能,缓存中的数据通常是持久化类的实例,例如JavaBean实例,它按照较低的频率和数据存储源进行同步,用来持久化被应用程序修改的数据,获取应用程序需要但缓存中没有的数据。应用程序和缓存之间可以进行高频率的数据交换,应用程序可以从缓存中查询数据,并且可以修改它们。
      缓存的物理介质是内存,而永久性数据存储源的物理介质通常是硬盘或者磁盘。应用程序直接读取内存的速度显然比读取硬盘的速度要快。
      (1)缓存的范围
      缓存的范围决定了缓存的生命周期及它可以被谁访问。一般分为以下三类。
      –事务范围:缓存只能被当前事务访问,当事务结束,缓存也就结束了生命周期。这里的事务可以是数据库进程,也可以是应用程序进程。每个事务都有独自的缓存。缓存中的数据不仅包含类的对象,而且还有对象与对象之间的关系。
      –进程范围:缓存被进程内的所有事务共享,每个事务可能有自己事务范围内的缓存。所以进程范围的缓存就是其第二缓存。这些事务可能会并发的访问缓存,所以必须采取必要的事务隔离机制。当进程介绍,缓存也就结束了它的生命周期。进程范围的缓存可以存放大量的数据。这些数据可以既包含类的对象,又包含对象之间的关系,也可以仅包含类的对象而没有对象之间的关系。它的物理介质可以是内存或硬盘。
      –群集范围:在群集环境下,缓存被多个机器的多个进程所共享,缓存的数据被复制到群集环境中每个进程的节点上,进程之间考远程通信来保证缓存数据的一致性。缓存中的数据通常也是仅包含类的对象。
      (2)缓存的并发访问策略
      当多个事务同时访问持久化的缓存时,也可能会出现各种并发事务问题。事务范围的缓存被一个事务独有,所以不会出现并发问题,但是进程范围、群集范围的缓存被多个事务共享,它们在同一时刻,可能会被多个事务共同访问,所以必须采取并发访问策略,根据隔离级别的不同,可以分为以下四种:
      –事务型(级别最高):它对应Repeatable Read隔离级别。如果缓存中的数据经常被堵,但是很少被修改,它可以采用这种隔离类型,因为它可以有效的防止脏读和不可重复读这类并发问题。
      –读写型:它对应Read Committed隔离级别。它也适应于经常被堵,但是很少修改的缓存,它可以防止脏读。
      –非严格读写型:它不保证缓存中数据和数据库数据的一致性。因而必须给缓存中数据设置一个较短的生命周期,强迫它按照较高的频率与数据库同步,从而避免脏读。对于极少被修改,或者偶尔运行脏读的数据,可以采用这种策略。
      –只读型(级别最低):对于从来不会被修改的数据,例如参考数据,可以采用这种策略。
  2. Hibernate的二级缓存结构
      –:第一级缓存是session对象的缓存。由于session对象的生命周期通常对应一个数据库事务,因而它是事务范围缓存。这一级缓存是必须的,程序员无法将它卸除。在这一级缓存中不仅保存类的实例,还保存实例之间的关系。每个实例的id属性都不为空。
      –:第二季缓存是一个可插拔的缓存插件,它有SessionFactory控制。由于SessionFactory的声明周期和整个进程向相对应,因而该缓存是进程范围或者群集范围的。该缓存被多个事务共享,所以可能会出现并发问题,必须为其设置并发访问策略。Hibernate使用缓存适配器把缓存实现软件和Hibernate继承,有多重缓存实现软件,程序员可以根据需要去选择。
原创粉丝点击