Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2793241
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: Java

2012-03-13 20:20:10


 ehcache.xml文件

点击(此处)折叠或打开

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!--
  3.     defaultCache节点为缺省的缓存策略
  4.      maxElementsInMemory 内存中最大允许存在的对象数量
  5.      eternal 设置缓存中的对象是否永远不过期
  6.      overflowToDisk 把溢出的对象存放到硬盘上
  7.      timeToIdleSeconds 指定缓存对象空闲多长时间就过期,过期的对象会被清除掉
  8.      timeToLiveSeconds 指定缓存对象总的存活时间
  9.      diskPersistent 当jvm结束是是否持久化对象
  10.      diskExpiryThreadIntervalSeconds 指定专门用于清除过期对象的监听线程的轮询时间
  11.  -->
  12. <ehcache>
  13.     <diskStore path="D:\cache"/>
  14.     <defaultCache maxElementsInMemory="1000" eternal="false" overflowToDisk="true"
  15.         timeToIdleSeconds="120"
  16.         timeToLiveSeconds="180"
  17.         diskPersistent="false"
  18.         diskExpiryThreadIntervalSeconds="60"/>
  19.     <cache name="cn.itcast.bean.Person" maxElementsInMemory="100" eternal="false"
  20.     overflowToDisk="true" timeToIdleSeconds="300" timeToLiveSeconds="600" diskPersistent="false"/>
  21. </ehcache>


点击(此处)折叠或打开

  1. @Test
  2.     public void testGetPerson() {
  3.         Person person = personService.getPerson(2);
  4.         System.out.println(person.getName());
  5.         try {
  6.             System.out.println("请关闭数据库");
  7.             Thread.sleep(1000*15);
  8.         } catch (InterruptedException e) {
  9.             e.printStackTrace();
  10.         }
  11.         System.out.println("第二次开始获取");
  12.         person = personService.getPerson(2);
  13.         System.out.println(person.getName());
  14.     }

我们让程序睡眠15秒,然后把数据库给关闭掉,一样可以把数据读出来

在需要缓存的实体bean配置文件中加入缓存配置项

        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "-

3.0.dtd">

   
     

region="cn.itcast.bean.Person"/>
       
           
       

       
   

usage说明了缓存的策略,region指定缓存的区域名

 

Ehcache默认的配置文件ehcache.xml(放在类路径下)

   
   

“ overflowToDisk="true"
        timeToIdleSeconds="120"
        timeToLiveSeconds="180"
        diskPersistent="false"
        diskExpiryThreadIntervalSeconds="60"/>

eternal="false"
    overflowToDisk="true" timeToIdleSeconds="300"

timeToLiveSeconds="600" diskPersistent="false"/>

Session 的缓存被称为的第一级缓存。SessionFactory的外置缓存称为 的二级缓存。这两个缓存都位于持久层,它们存放的都是数据库数据的拷贝。SessionFactory的内置缓存 存放元数据和预定义SQL,   SessionFactory的内置缓存是只读缓存。

二. 一级缓存的管理:

当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的 list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中。当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。 Session为应用程序提供了两个管理缓存的方法: evict(Object obj):从缓存中清除参数指定的持久化对象。 clear():清空缓存中所有持久化对象。

三. Hibernate二级缓存的管理:

1. Hibernate二级缓存策略的一般过程如下:
1) 条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL语句查询数据库,一次获得所有的数据对象。
2) 把获得的所有数据对象根据ID放入到第二级缓存中。
3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。
4) 删除、更新、增加数据的时候,同时更新缓存。
Hibernate二级缓存策略,是针对于ID查询的缓存策略,对于条件查询则毫无作用。为此,Hibernate提供了针对条件查询的Query Cache。

2. 什么样的数据适合存放到第二级缓存中?
1) 很少被修改的数据
2) 不是很重要的数据,允许出现偶尔并发的数据
3) 不会被并发访问的数据
4) 参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。

3. 不适合存放到第二级缓存的数据?
1) 经常被修改的数据
2) 财务数据,绝对不允许出现并发
3) 与其他应用共享的数据。

4. 常用的缓存插件 Hibernater二级缓存是一个插件,下面是几种常用的缓存插件:
◆EhCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持。
◆OSCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持。
◆SwarmCache:可作为群集范围内的缓存,但不支持Hibernate的查询缓存。
◆JBossCache:可作为群集范围内的缓存,支持事务型并发访问策略,对Hibernate的查询缓存提供了支持。

5. 配置Hibernate二级缓存的主要步骤:
1) 选择需要使用二级缓存的持久化类,设置它的命名缓存的并发访问策略。这是最值得认真考虑的步骤。
2) 选择合适的缓存插件,然后编辑该插件的配置文件。

阅读(679) | 评论(0) | 转发(0) |
0

上一篇:spring+hibernate(集成)

下一篇:SSH2

给主人留下些什么吧!~~