个人对Hibernate框架中的缓存的研究总结

谈到缓存,首先要知道我们所说的缓存是啥意思。

缓存:介质是内存,在我们获取数据的时候,第一次读取数据时会将数据放入缓存中,第二次获取同样数据的时候直接从缓存中获取。这样能够减少数据库的压力,提供程序的性能。

我们常说的缓存的分类:页面缓存和数据缓存(今天这里主讲数据缓存)

数据缓存,对于Hibernate中,hibernate又做了细分,也是分两种:一级缓存和二级缓存

  • 一级缓存

一级缓存:又称为session缓存,hibernate一级缓存

一级缓存的生命周期:hiberante一级缓存,说到底,其实是靠session里面的一系列集合构成的session缓存,按照javase中对方法的理解,就是session对象初始化,session里面的集合也随着进行初始化,相应的也就是一级缓存初始化。然后session对象释放,session中的集合也会释放,相应的也就是一级缓存也会释放。简单一点,一级缓存的生命周期就是session的生命周期。

一级缓存中存放的数据的特点:存放的都是持久对象(所以我们持久对象与session关联的本质,就是让持久对象能够缓存到一级缓存中)

一级缓存的读取:get,load可读可写,但是query不是,query只写数据到缓存的,但是从来不会从一级缓存中读取数据。

(补充)一级缓存快照:是数据库中数据的副本,第一次访问数据库的时候,把数据放入一级缓存和一级缓存快照中,当对缓存中的数据进行了修改,当我们flush缓存的时候,快照会去比较是否和缓存中的数据一致,如果不一致,就立马去更新数据库。它保证了一级缓存、数据库、快照三者数据同步。默认我们提交事务的时候可以刷新缓存,但是这种缓存刷新模式是可以修改的(有手动flush,commit事务的时候刷新缓存,或者query在从数据库中获取数据前进行判断是否刷新)

缺点:是事务级别的缓存,与session生命周期绑定,一个线程对应这一个session,不利于多用户之间的数据共享。

好处:是hibernate自身维护的,不需要我们进行其他操作,只要会取数据就行了

  • 二级缓存

二级缓存:又叫做sessionFactory缓存,session工厂缓存

特点:一级缓存的生命周期是session,session结束,一级缓存中的数据就没了,但是二级缓存是进程级别的缓存,一直到sessionFactory释放,但是sessionFactory在一个项目中只会初始化一次,所以sessionFactory换粗可以真正的实现多session(用户)之间的数据共享,需要自己去维护。

Hibernate二级缓存分类:内置二级缓存和外置二级缓存

内置二级缓存:缓存的是hibernate.cfg.xml和hbm文件中配置的内容,hibernate自身维护

外置二级缓存:需要开发人员自己提供缓存插件(一般情况下,我们工作中说的二级缓存就是指外置的二级缓存)

hibernate对二级缓存又做了细分:查询缓存和普通二级缓存(工作中说的也是普通二级缓存)

常用的hibernate缓存插件:

  1. memache:集群环境中使用的最多
  2. ehcache:支持hibernate的查询缓存,开源的java分布式缓存
  3. swarmcache:貌似不太支持查询缓存,可作为集群范围内的缓存
  4. Jbosscache:支持查询缓存,可作为集群范围内的缓存
  5.  

普通二级缓存又进行了划分:类级别的二级缓存策略,集合级别的二级缓存策略

类级别的二级缓存策略:需要在hibernate.cfg.xml后者hbm文件中进行配置(hbm会覆盖cfg中的内容),它封装数据的特点是:封装的都是散装数据(打印出来的哈希值不一致),可以通过get,load,query.list方式往二级缓存中存数据,然后通过get,load,query.iterator方式从二级缓存中取数据(说白了,取出数据依据但是#oid)

集合级别的缓存策略:封装数据的特点是,获取的是oid属性,然后具体Oid对应的那个对象保存在类级别的缓存区域中,所以我们在配置的时候既要配置集合级别的缓存策略还要配置类级别的缓存策略

(补充):query.list支持写不支持读,可以使用iterator从二级缓存中读,它会取id属性,把具体的数据保存到类级别缓存区域中,用到非id以外的数据的时候像load一样去二级缓存中找,有就直接拿,没有就发sql语句

查询缓存:它的好处是,存放的是键值对,key是sql语句,value是结果,如果是非实体数据(例如通过投影查询获取的数据)那么就直接存放这个非实体数据,如果是实体数据,存放的还是Oid数组,具体数据还是保存在类级别的缓存区域中。缺点是需要配置文件和程序中手动开启查询缓存
 

猜你喜欢

转载自blog.csdn.net/qsw2lw/article/details/88943432