1,事务缓存
Hibernate的默认缓存(不能被取消),单会话缓存(一级缓存)。其只能被当前事务访问,每个事务都有自己的缓存
生命周期依赖于事务的生命周期:当事务结束时,缓存的生命周期也结束(事务缓存使用内存作为缓存介质)
当使用会话的 get() 方法,load(),save(),saveOrUpdate()方法方法,update() 方法或查询接口方法时,休眠会对实体对象存入缓存。当通过load () ,get () 方法获取对象时,会首先到缓存中查询,找不到则发出的的Sql语句去数据库查,从而提高效率。
与一级缓存管理相关的方法:
(1)session.evict(Object o):从session缓存中删除某一对象。
(2)session.clear():清空会话缓存。
(3)session.contains(Object o):判断会话缓存中是否包含某一对象。
(4)session.flush():定义刷新点。
2,应用范围缓存
二级缓存,是单个的SessionFactory的缓存其可以被应用程序的所有事务共享访问缓存的生命周期依赖于应用的生命周期:应用结束缓存也就结束。
Hibernate中开启二级缓存(EHcache)
<!-- 开启缓存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.internal.EhcacheRegionFactory</property>
<!-- 添加需要缓存的类 -->
<class-cache usage="read-only" class="XXX.XXX.XXX"/>
3,集群缓存
多的SessionFactory的缓存,在集群环境中,缓存被一个或多个机器的进程锁共享。缓存中的数据被复制到集群中的每一个进程节点,进程间通过远程通信来保证缓存中数据的一致性。介质可以是硬盘或内存。(有些休眠的二级缓存第三方插件支持集群缓存)
4,快照
即副本,休眠中的快照即数据库的副本。快照中的数据始终保持与DB中一致。不能由代码进行修改。
当事务提交时休眠会把快照和会话缓存中的数据进行比较,若不一致则进行更新数据库同时更新快照。即调用了了Session.update()等方法修改了会话缓存,在事务commint()时即session的同步才会更新数据库。
session同步时间点只有一个即事务得commit(),由可能更新数据库。
会议的刷新有很多个删除(),更新,获得()都是刷新。
5,Session.currentSession和的的getSession的区别
currentsession:1,同一个线程会话一样
2,事务提交或者回滚之后会自动关闭会话
3,需要注册环境
4,查询语句必须在事务内查询
的getSession:1,每次都获取一个新的会话
2,必须手动关闭
3,无需祖册运行环境
4,查询语句可以不在事务内执行