hibernate内部缓存

一、hibernate内部的缓存分析
缓存的作用主要用来提高性能,可以简单的理解成一个Map;
使用缓存涉及到三个操作:把数据放入缓存、从缓存中获取数据、删除缓存中的无效数据。


1、一级缓存:
Session级别的缓存


(1)什么时候会将数据放入缓存
save,update,saveOrUpdate,load,get,list,iterate,lock这些方法都会将对象放在一级缓存中,


(2)什么时候从缓存中取数据?
get、load方法会从缓存中取数据,如果存在则直接返回对象,否则会去数据库中查询对象并返回
Query接口实现查询(list),不从缓存中提取数据
Criteria 不从缓存中获取数据


(3)一级缓存不能控制缓存的数量,所以要注意大批量操作数据时可能造成内存溢出; 
可以用evict,clear方法清除缓存中的内容。session释放也会清楚缓存中的内容
evict(object) 可以带参数   清除指定对象的缓存
clear  清除一级缓存中的所有对象


(4)缺陷:没有保护、共享的范围太小了(session声明周期太短了)


2、二级缓存
SessionFactory级共享
在hibernate.cfg.xml配置二级缓存,主要告诉hibernate第三方缓存的提供者
(1)cache.use_second_level_cache: true  决定要不要打开二级缓存,这个属性默认值就是true,该属性不配置也可以
(2)cache.provider_class   cache的提供者是谁 常用的是:org.hibernate.cache.OSCacheProvider
需要将oscache需要的jar包构建到项目中
需要将oscache.properties拷贝到src目录下
(3)<class-cache/>:告诉hibernate那些类对象需要放入缓存,默认的是都不放入缓存
方法一:<class-cache usage="read-only" class="com.hbsi.domain.User"/>
usage:read-only 效率最高,但是有一个限制,如果缓存中的数据被更新,会报异常
read-writer  
nonstrict-read-writer  可读写,不太严格,会出现无效数据等情况
transactional
在hibernate.cfg.xml位置应该在mapping标签后面
方法二:在类对应的映射文件中设置
在class标签里面。只指定usage属性即可
(4)载入commons-logging-1.1.1.jar 文件,这是一个日志的文件。




它会先从一级缓存中去找,找不到再去二级缓存中去找。
命中:
miss错过:
100


在配置文件中配置属性generate_statistics 为true系统才会产生统计信息,然后
在Statistics st=SessionFactory.getStatistics()//得到缓存的统计信息
st.getStartTime();        开始的时间
st.getSessionOpenCount();  session打开的次数
st.getSessionCloseCount(); session关闭的次数
st.getSuccessfulTransactionCount()事务成功提交。
...
st.getSecondLevelCacheHitCount() 命中统计
st.getSecondLevelCachePutCount() 放入统计
st.getSecondLevelCacheMissCount() miss错过统计


Query查询的命中。miss 放入次数
st.getQueryCacheHitCount();
st.getQueryCacheMissCount();
st.getQueryCachePutCount();







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值