Hibernate学习笔记三(缓存)

分为两级:session级别(一级缓存)、sessionFactory 二级缓存

session缓存,必须在同一个session中,如果session关闭,缓存就丢失了。缓存级别比较短暂。
save,update,saveOrUpdate,load,get,list,iterator ,lock操作后,对象都会放在一级缓存中。
get,load,query iterator可以从一级缓存中取数据。
手工清除一级缓存:
session.evict(object); 清除单个缓存。
session.clear()方法清除所有缓存

二级缓存:
依赖第三方的实现,ehchache,oscache,jbosschache。
1.配置使用二级缓存
cache.use_second_level_cache = true 默认是使用二级缓存的。
cache.provider_class 设置缓存提供类
配置oscache 或 ehcache配置文件。
2.配置哪些类需要使用二级缓存
通过配置文件声明缓存类
在hbm.xml中声明缓存。<cache usage="read-write"/>
3.配置缓存策略
read-only: 只读,永远不能修改,如果修改,报异常。效率较高
read-write:读写,能够保证并发情况下,不出错。进行加锁,保证同步。效率低
nostrict-read-write 不严格的读写,比read-write效率高
transaction:回滚缓存中的对象,目前只有jboss实现了。

hibernate.generate_statistics = true 打开统计信息。默认关闭。打开后会影响性能。
通过 sessinFactory.getStatistics() 获取统计信息。

native的主键生成策略,在save时不会存入二级缓存,需要一次查询。
hilo生成策略,当save时后将对象就直接保存到二级缓存了。

update,saveorUpdate,list,iterator,get,load,query,criteria会将对象填入二级缓存
get,load,iterator 会从二级缓存中取得对象。

手工清除二级缓存
sessionFactory.evict(Object.class) 清除指定类型的二级缓存。
sessionFactory.evict(Object.class,id);清除单挑对象

查询缓存:
cache.use_query_cache = ture,默认关闭
query.setCacheable(true);

查询缓存结构:
key,(Integer)ids,缓存中存储的是对象的Id,真正的对象存储到一级、二级缓存。这样做可以减少缓存存储空间。
当查询的时候,首先从二级缓存中取得ids,在循环,根据id,调用session.get方法进行查询,最理想的情况下,所有的对象都命中,这样就不会发生查询语句,最不理想的情况,出现N+1。

分布式缓存
传播通知更新缓存
缺点:更新数据成本很高

中央缓存
单独一台缓存服务器
缺点:获取数据的成本比较高

使用缓存条件
1.读取次数大于更新次数
2.数据量不能太大
3.对数据要有独享控制
4.可以容忍无效的数据

你可能感兴趣的:(数据结构,xml,Hibernate,jboss,cache)