【存放对象实体】
一级缓存 会话(针对一个session,相当于一个线程 hibernate自带的,自动管理的):(生命周期在当前的会话(session),不同session属于不同会话) Map
原理:查询的时候,首先会去缓存找,若缓存存在,则获取,若不存在,去数据库查询
1、第二次查询同一对象时,并没有再次执行数据库查询
2、在不同session中多次查询同一对象时,会执行多次数据库查询
3、一级缓存中,持久化类的每个 实例都具有唯一的OID
flush() 同步到数据库
evict(Object obj) 清除缓存中的object对象
clear() 清除中所有的持久化对象
Query.list() 不会使用缓存
Query.iterate() 使用缓存 (首先查出所有的Oid,根据Oid去缓存找,若缓存存在,则获取,若不存在,去数据库查询)
二级缓存 应用(所有session共有,ehcache,第三方的 需要配置开启): HashTable
开启二级缓存需要针对特定一个类进行开启,
开启后,session1和session2.....将会共有 (即为session1和session2都执行查询同一个对象时候,只会发出一sql语句)
具有以下特征的数据可放入二级缓存中:
- 很少被修改的数据
- 不是很重要的数据,允许出现偶尔并发的数据
- 不会被并发访问的数据
- 参考数据
禁止一二级缓存交互:
在save方法前调用session.setCacheMode(CacheMode.IGNORE)。
【主要存放普通属性的数据,也可存放查询实体对象的id】
查询缓存:
配置:
hibernate的查询缓存默认是关闭的,如果要使用就要到hibernate.cfg.xml文件里配置:
<property name="hibernate.cache.use_query_cache">true</property> |
并且必须在程序中手动启用查询缓存,在query接口中的setCacheable(true)方法来启用。
除非是多次查询都是查询相同条件的数据,也就是说返回的结果总是一样,这样配置查询缓存才有意义。