Hibernate内部缓存的分析:

来源:互联网 发布:淘宝店仓库管理 编辑:程序博客网 时间:2024/06/05 02:30
 

Hibernate内部缓存的分析:

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

 

1、  一级缓存:

Session级别的缓存

(1)什么时候会将数据放入缓存?

当在调用save() 、 update()、saveOrUpdate()、load()、get()、list()  等方法时,在使用hql查询时,都会把数据放入一级缓存中。

目的:以后在从数据库查询数据时,优化查询功能,提高系统的性能。

 

(2)什么时候从缓存取数据?

        get()  load()会从缓存中取数据,如果缓存中有对象直接返回该对象,如果没有该对象从数据库中找对象

Query接口实现查询(调用list()方法),不从缓存中提取数据   

Criteria:不从缓存中提取数据

(3)一级缓存不能控制缓存的数量,所以要注意大批量操作数据时可能造成内存溢出;

可以用evict,clear方法清除缓存中的内容。session释放也会清楚缓存中的内容

evict(object) 可以带参数   清除指定对象的缓存

clear  清除一级缓存中的所有对象

(4)一级缓存的缺陷:

        没有保护,共享范围太小

        Session.clear();      session.evict(object);

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>:告诉hibetnate哪些类对象需要放入缓存,默认的是都不放入缓存。

方法一、

<class-cache class=”com.hbsi.domain.User”  usage=”read-only”/>

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();

 

原创粉丝点击