管理Hibernate缓存

3/8/2017来源:ASP.NET技巧人气:1834

缓存的基本原理

      缓存介于应用程序和永久性存储设备之间,作用是降低应用程序直接访问永久新存储设备的频率,从而提高应用的运行性能。       sessionFactory的缓存分为内置缓存和外置缓存,内置缓存是自带的,不可拆卸,通常在Hibernate初始化阶段,Hibernate会把映射元数据和预定义的SQL语句放到内置缓存中,内置缓存是只读缓存,应用程序不能修改里面的内容,所以不用同步更新。        SessionFactory的外置缓存是一个可配置的缓存插件,默认情况不会启动,外置缓存中的数据是数据库的复制,外置缓存的介质可以是内存或硬盘。        session为Hibernate的一级缓存,外置缓存为二级缓存。都在持久化层,都存放数据库的复制。 1.持久化层的缓存范围        1.1事务范围          缓存只能被当前事务范围,缓存的生命周期依赖于事务的生命周期。介质是内存。每个事务都有独自的缓存,缓存内的数据通常采用互相关联的对象形式。同一个事务中,持久化类的每个对象具有唯一OID,不能出现两个OID相同的持久化类的对象。 1.2进程范围         缓存被进程范围内的所有事务共享。事务有可能并发访问,所以要有事务隔离机制。缓存的生命周期依赖于进程的生命周期。可能存放大量数据,所以介质可能是内存或硬盘。缓存中的数据可以以相互关联的对象形式,也可以是散装形式。         如果以相互关联的对象形式存储,缓存里面就是各个事务共用一个对象,如果一个事务操作一个对象太久,会影响性能,而且容易造成死锁,所以不推荐这种方式。         如果以散装方式存储,那么每个事务的对象都是不同的,都是从缓存中读取对象,然后再各个事务的缓存中创建实例。只有多个事务同时读取相同对象时,要才去事务隔离措施。 1.3集群范围         在集群环境中,缓存被同一机器或多台机器的多个进程共享。缓存中的数据被复制到每个进程的节点上,进程之间通过远程通信保证缓存中数据的一致性。通常采用散装数据形式。         数据先从事务范围的缓存读取,没有就到进程或者集群范围读取,没有就到数据库读取。事务范围的缓存时持久化层的一级缓存,通常是必须的,进程和集群为二级缓存,通常是可选的。 2.持久化层的缓存并发访问策略                   两个事务同一时刻访问进程范围的缓存同一对象,同一时刻访问数据库,都会出现并发问题。如果是关联形式对象的话同时访问事务中的同一对象也会有并发问题。         二级缓存有4中并发访问策略。 1.事务型:仅在受管理环境中使用。提供的repeat-read级别的隔离机制。经常读很少修改时可以使用 2.读写型:提供read-commited事务级别,仅在非集群环境中适用。经常读很少修改情况下使用。 3.非严格读写型:不保证缓存和数据库数据的一致性。极少修改偶尔允许脏读的情况下可以采用。 4.只读型:从来不会被修改的数据。         所以放到二级缓存中的数据要有一些特点:很少被修改;不是很重要的数据,允许出现偶尔的并发问题;不会被并发访问的数据,参考数据。         参考数据:实例数目有限;每个实例会被其他很多实例引用;很少修改。         一些数据不适合被放到缓存中:经常被修改的数据;财务数据;与其他应用共享的数据。 二级缓存的结构:并发访问策略;查询缓存;还有缓存适配器用于把具体的缓存实现软件和Hibernate集成。

管理Hibernate的一级缓存

       session的save,update,load,get这些方法以及Query的list(),iterate(),filter(),缓存中没有对象的话,session会把对象加到缓存中,让后清理缓存时,同步更新数据库。        session为程序提供了两种管理缓存的方法: 1.evict(Object o)从缓存中清理指定的持久化对象。 2.clear()清空缓存内的持久化对象。 evict()适用于以下情况: 1.不希望session按照对象状态更新数据库 2.批量更新和删除时,更新或删除了对象,即时释放内存。        evict()如果cascade为all或者all-delete-orphan时,会级联清除对象。不提倡通过evict和clear来管理一级缓存,因为不能显著的提高程序性能。管理一级缓存最有效的方式是采用合理的检索策略和检索方式来节省内存开销。

管理Hibernate的二级缓存

       二级缓存也有evict()方法,一级缓存和二级缓存有5中交互模式: 1.CacheMode.NORMAL:正常模式(默认模式),session会向二级缓存读数据,也会写数据。 2.CacheMode.IGNORAL:忽略模式,不会写也不会读。 3.CacheMode.GET:读取模式:session会从二级缓存中读取,不会写入。 4.CacheMode.PUT:写入模式,session不会向二级缓存中读取数据,但是会写入从数据库读到的数据。 5.CacheMode.REFRESH:刷新模式,session不会向二级缓存中读取数据,但是会写入从数据库读到的数据。与put的区别在于刷新模式会强制刷新二级缓存中的所有数据。