且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Hibernate--实现二级缓存!

更新时间:2022-09-16 18:03:32

      做J2EE开发,有时为了提高一些项目(例如:web开发)的性能,总会有一些方案去提高

交互的速度。这里特指一些访问量很大,或者说对时间性能上要求比较高的项目。我们常见的是

静态化技术,就是利用模板,把页面中需要动态提取的数据取代成一段字符串,然后后台写一个

方法提取数据并替换页面字符串,重新生成静态页(HTML页面)。然后让用户访问静态页面。一段

时间以后再借助人工或js调用,或者是监听器调用静态化方法,更新数据,重新生成静态页。这个

方案实现了彻底的静态,但是还是具有一定的复杂度,且不易维护拓展的弊病,一旦页面不再使用,

那么模板也就没用了,所有静态化方法还要重写。

-------------------------------------------------------------------------------------------------

           本文会介绍一种方法,也是大家都听说过的----缓存技术,这个方案在J2EE开发中一般要

借助第三方缓存框架支持。我在这里也不介绍具体的缓存内部实现细节,因为我还没有看那些框架

的源码。但是不了解内部实现,并不影响我们去使用它们。

-------------------------------------------------------------------------------------------------

还是使用Hibernate来配置,在介绍配置方案前,先说说hibernate中的缓存:

hibernate中有两种缓存级别,分别是Session级别(一级缓存)和SessionFactory级别(二级缓存)。

          一级缓存是session级共享,save,update,saveOrUpdate,load,get,list,iterate,lock这些方法都会将对象放在一级缓存

中,一级缓存不能控制缓存的数量,所以要注意大批量操作数据时可能造成内存溢出;可以用evict,clear方法清楚缓存中的内容。


          二级缓存是SessionFactory级共享,实现可插拔,通过修改配置文件参数就可以使用。

hibernate内置了对EhCache,OSCache,TreeCache,SwarmCache的支持,可以通过实现CacheProvider和Cache接口加入。

Session的:save(此方法不适合native生成方式的主键),update,saveOrUpdate,list,iterator,get,load,以及Query,

Criteria都会填充二级缓存,但查询缓存时,只有Session的iterator,get,load会从二级缓存中取数据。

Query,Criteria由于命中率较低,所以hibernate缺省是关闭的。Query查询命中低的一方面原因就是条件很难保证一致,且数据量

大,无法保证数据的真实性。

我在这里以应用十分广泛的OSCache第三方缓存框架为例,谈谈具体实现。

-------------------------------------------------------------------------------------------------

*********实现OSCache二级缓存的配置方案***********

1.首先我们需要在hibernate.cfg.xml中配置几个属性:

<!-- 是否开启二级缓存,缺省为开启 -->
<property name="cache.use_second_level_cache">true</property>
<!-- 选择第三方缓存框架支持 -->
<property name="cache.provider_class">org.hibernate.cache.OSCacheProvider</property>

 

为了能够查看二级缓存的使用效果,还可以配置:

<property name="generate_statistics">true</property>


2.然后是哪些类需要配置二级缓存:(举例User实体类)

<class-cache class="com.sy.vo.User" usage="read-write" />


其中usage是策略,属性值:

read-only:只读,效率最高。
read-write:读写,效率较低。但是能保证并发正确性。
nonstrict-read-write:非严格的读写,效率较高,不用加锁,不能保证并发正确性。例如帖子浏览量。
transactional:事务性缓存,可回滚缓存数据,一般缓存框架不带有此功能,实现很复杂。

这样hibernate.cfg.xml就配置完了。

3.配置映射文件User.hbm.xml,加入这句代码:

<cache usage="read-write"/>

 

4.加入oscache.properties配置文件到classPath下,这个文件在hibernate源码包中有。里面
有很多属性可以设置,如果只是简单实现,不需要修改。不修改的情况下,只有一个配置,是
配置二级缓存的大小,这个视本机内存而定。默认1000。
其中还有一个分布式的配置,可以设置主机IP等等。由于资源有限,我没有做实验。在此不做过多介绍。

OK,配置完成!

----------------------------------------------------------------------------------------------------------

写一个测试类,测试吧。
补充一个测试方法:

Statistics st=HibernateUtil.getSessionFactory().getStatistics();

 

通过输出st的信息,可以查看缓存的使用情况。

再补充一个清除二级缓存的方法:

HibernateUtil.getSessionFactory().evict(User.class);//清除一个实体类的所有缓存
HibernateUtil.getSessionFactory().evict(User.class,id);//清除单条缓存

 本文转自施杨博客园博客,原文链接:http://www.cnblogs.com/shiyangxt/archive/2008/12/30/1365407.html,如需转载请自行联系原作者