Hibernate缓存
缓存
缓存是位于应用程序和永久性数据存储源之间用于临时存放复制数据的内存区域,缓存可以降低应用程序之间读写永久性数据存储源的次数,从而提高应用程序的运行性能
hibernate在查询数据时,首先会到缓存中查找,如果找到就直接使用,找不到时才从永久性数据存储源中检索,因此,把频繁使用的数据加载到缓存中,可以减少应用程序对永久性数据存储源的访问,使应用程序的运行性能得以提升
hibernate的缓存范围
- 事务范围,每个事务都有自己的缓存,缓存内数据不会被多个事务并发访问。缓存只能被当前事务访问,缓存的生命周期依赖于事务的生命周期,事务结束时,缓存的生命周期也结束。
- 进程范围,或者说是事务范围外。缓存内的数据可以被多个session共享。进程内的所有事物共享缓存,进程结束,缓存结束生命周期,例如hibernate的二级缓存,SessionFactory对象的生命周期对应应用程序的整个进程,因此它属于进程范围的缓存。
- 集群范围,多台主机范围内共享。
Hibernate的一级缓存
Hibernate的一级缓存指的是Session缓存。一级缓存的生命周期和session的生命周期一致,当前session一旦关闭,一级缓存就消失了,因此一级缓存也叫session级的缓存或事务级缓存,一级缓存只存实体对象,它不会缓存一般的对象属性(查询缓存可以),即当获得对象后,就将该对象缓存起来,如果在同一session中再去获取这个对象时,它会先判断在缓存中有没有该对象的id,如果有则直接从缓存中获取此对象,反之才去数据库中取,取的同时再将此对象作为一级缓存处理。
可以调用到一级缓存的操作:save(),update(),saveOrupDate(),get(),load()或者Query和Criteria实例的list(),iterate()
hibernate的二级缓存
hibernate的二级缓存,分为两种:
内置缓存:也叫作session Factory缓存,Hibernate自带的,不可卸载,通常在Hibernate的初始化阶段,Hibernate会把映射元数据和预定义的SQL语句放置到Session Factory的缓存中。该内置缓存是只读的。
外置缓存:常说的二级缓存也就是外置缓存,在默认情况下Session Factory不会启用这个缓存插件,外置缓存中的数据是数据库数据的复制,外置缓存的物理介质可以是内存或者硬盘。
并发访问策略
| transactional(事务型) | 仅在受管理的环境中适用提供Repeatable Read事务隔离级别适用经常被读,很少修改的数据可以防止脏读和不可重复读的并发问题缓存支持事务,发生异常的时候,缓存也能够回滚 |
|---|---|
| read-write(读写型) | 提供Read Committed事务隔离级别在非集群的环境中适用适用经常被读,很少修改的数据可以防止脏读更新缓存的时候会锁定缓存中的数据 |
| nonstrict-read-write(非严格读写型) | 适用极少被修改,偶尔允许脏读的数据(两个事务同时修改数据的情况很少见)不保证缓存和数据库中数据的一致性为缓存数据设置很短的过期时间,从而尽量避免脏读不锁定缓存中的数据 |
| read-only(只读型) | 适用从来不会被修改的数据(如参考数据)在此模式下,如果对数据进行更新操作,会有异常事务隔离级别低,并发性能高在集群环境中也能完美运作 |
综上:适合放入二级缓存的数据一般为读取量大的只读数据或者并发量不大的可修改数据
二级缓存的配置 (EHCACHE)
配置依赖jar包
org.hibernate
hibernate-ehcache
${org.hibernate-version}
hibernate配置文件中开启ehcache
true
org.hibernate.cache.EhCacheProvider
配置缓存数据对象并发策略
配置ehcache.xml
Hibernate一级缓存和二级缓存的对比
….To Be Continue