hibernate一级缓存
1.Hibernate一级缓存又称为“Session缓存”,“会话级缓存”。
2.通过Session从数据库查询实体时会把实体在内存中存储起来,下一次查询同一实体时不再从数据库获取,而是从内存中获取,这就是缓存
3.一级缓存的生命周期和Session相同,Session销毁,它也销毁。
4.一级缓存中的数据可适用范围在当前会话之内。
why(为什么要用Hibernate缓存?)
Hibernate是一个持久层框架,经常访问物理数据库。
为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。
缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据
what(Hibernate缓存原理是怎样的?)Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存。
1.Hibernate一级缓存又称为“Session的缓存”。
Session内置不能被卸载,Session的缓存是事务范围的缓存(Session对象的生命周期通常对应一个数据库事务或者一个应用事务)。
一级缓存中,持久化类的每个实例都具有唯一的OID。
2.Hibernate二级缓存又称为“SessionFactory的缓存”。
由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。
第二级缓存是可选的,是一个可配置的插件,默认下SessionFactory不会启用这个插件。
Hibernate提供了org.hibernate.cache.CacheProvider接口,它充当缓存插件与Hibernate之间的适配器。
什么样的数据适合存放到第二级缓存中?
1) 很少被修改的数据
2) 不是很重要的数据,允许出现偶尔并发的数据
3) 不会被并发访问的数据
4) 常量数据
不适合存放到第二级缓存的数据?
1) 经常被修改的数据
2) 绝对不允许出现并发访问的数据,如财务数据,绝对不允许出现并发
3) 与其他应用共享的数据。
管理一级缓存的API
1.evict(),用于将某个对象从Session的一级缓存中清除。
2.clear(),用于将一级缓存中的所有对象全部清除。
经过一段时间的开发,以及内部测试,同程网联盟景区新版程序正式发布推出,感谢广大联盟会员一直以来的支持与关注! 同程网联盟景区新版程序新功能介绍:1.统一的页面风格。页面风格将与随后推出的度假线路、酒店、机票以及融合版联盟程序风格保持一直;2.新增后台管理系统。可更加方便快捷的对网站进行个性化设置;3.动态与伪静态切换。后台操作,简单便捷;4.缓存管理。新增缓存,提高网站访问速度,后台可定期清理;5
Qurey.list()和Qurey.iterate()
1.Qurey.list()查询数据,不会从一级缓存中查找,直接向数据库发送sql语句,将查询返回的对象保留在缓存中。
2.Qurey.iterate()不从一级缓存中找,直接向数据库发送sql,查询id,当需要使用对象其他属性的时候,先在缓存中根据id查找对象,如果没有则向数据库发送sql查询,因此单独用该方法查询会产生N+1问题(即向数据库发送N+1条语句查询N个对象的信息)
3.如果存在这种需求:在两个不同的session都需要对相同的对象进行访问,通过Qurey.list()需要发送两条sql语句甚至更多,为了避免可以设置二级缓存,在第一个session中Query.list(),在第二个session中直接通过Qurey.iterate()迭代从二级缓存中获取
hibernate二级缓存(SessionFactory缓存)
1.添加在hibernate.cfg.xml里面的配置
true org.hibernate.cache.ehcache.EhCacheRegionFactory ehcache.xml
2.配置ehcache.xml具体见
3.通过注释配置entity,在类前加上@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
CacheConcurrencyStrategy属性值常见的有READ_ONLY(对该entity对应的表数据只读取然后缓存)和READ-WIRTE(对表数据可以读取也可以更新)
4,一定要注意:hibernate二级缓存的必须是整个对象,如果查询的只是对象某些属性,那么该对象不会被缓存
查询缓存(SessionFactory级缓存)
1.在上述二级缓存的基础上继续配置
2.在hibernate.cfg.xml中添加配置
true
2.在entity注释上添加@Cacheable
3.在hql语句后要调用setCacheable(true)方法
4.只有当 HQL 查询语句完全相同时,连参数设置都要相同,此时查询缓存才有效
hibernate的三种状态(transient(瞬时状态),persistent(持久化状态)以及detached(离线状态))









