当前位置:编程学习 > JAVA >>

Hibernate 之 二级缓存

 二级缓存也称为进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享,换句话说就是一级缓存可以用二级缓存里的内容.二级缓存的生命周期和SessionFactory(重量级,一个数据库一个SessionFactory)的生命周期一致,SessionFactory可以管理二级缓存.
       二级缓存在Hibernate中有自己的实现叫做HashTable,但是不建议用它进行商用,可以用来进行测试.Hibernate的二级缓存有专门的缓存策略提供商(Cache Providers),例如EHCache,OSCache等.在这篇文章中我们主要介绍一下Hibernate二级缓存EHCache的用法.
    计算机生成了可选文字:表19.1.媛存策略提供内(Caoh.Provider:)Cach.R七址ablecla。。Clust.rSaf.Cach.S即pZ喎?http://www.zzzyk.com/kf/ware/vc/vcnQsZLDLyP3Su9Ov1MK/2sbfZWV5eXkobm90xf5lbmRlZGZvcnByb2R1Y3Rpb251OmUpb3JnLmjWuWVybmF0ZS5jYWNoZS5IYXNodGFibGVDYWNoZXByb3Y6ZGVyRUhDYWNoZU9TQ2Fj1rdvcmcuaGli0tFybmF0ZS5jYWNo0tGjrkVoY2FjschQcm92aWTS0XJvcmcuYta5ZXJuYXRlLmMuY2hlo661xENhY2hlUHJvdmxkZXJvcmcuaNa5ZXJuYXRlLmMuY2hlLnMuYXK95KGjY2hlUHJvdmlkZXJUs+VlbbDNVU9yecvvZXRub3J5o6zJvXNrbWVtb3J5o67OpXNrY8LvZXJlZNbZbaGwxt9DYUJ0KWPQrXRlcmVkw65ttKiho2Nhc3QpLHllcyhjbHVzdGVyZWS8+zA1NVRyZWVDYWNoZW9yZy5oyLBlcm5hdGUuY2FjaGWjrtbaZWVDYWNoZVByb3a5pGRlcsbftrxhY29vbtLReWVzKHLToc7lY7XEoaNuKXllcyhjZm9ja3PDrmNyZXEp" src="/2013/0115/20130115034710173.png" />
 
      二级缓存EHCache的配置和使用.
*将ehcache.xml文件拷贝到src下(在Hibernate3\etc\ehcache.xml路进行.从hibernate相关的例子中找配置文件)如下图:
计算机生成了可选文字:口D\,haxe\07)比.r.ot.\kiber抽t一32D小\kiberna忆一32\.tc大小,}l类纽文件川L皿0创踢L劝。创rR【了云石」1T!.矛以n双L劝0创PR【护!卫丁1PRO了艺五」1艺日Lno创口助口KB助助口KB口s月1巧“u,2se牛和文件夹任务刁,命名这个文件移枷名个文件复饱始个文件将这个文件发布到,介紧袖服雄洲打筋客个文件姗!除这个文件名称‘当cvrJ,lr一。1一〔t二.r.1口困困刀颐习小,卜.rn。、.c几一1鱼l,[。rna,.妙。p.r,1.:画‘:b,。‘t.Pro,.rt:.,t一,i.t.月、豆ber。。,一:,v:。.戚画10内,r。,,t:。.画ose.h.,r,ert,。:月tr“。‘比。耐
 
默认配置.
<defaultCache
       maxElementsInMemory="10000"
       eternal="false"
       timeToIdleSeconds="120"
       timeToLiveSeconds="120"
       overflowToDisk="true"
       />
配置的解释如下:
 <!--缺省配置 可以对类进行单独配置-->
        <!--最大对象数目 -->
        <!--是否过期 -->
        <!--多长时间没有被访问 -->
        <!--如果超过限制,则放入磁盘中 -->
 
可以进行单独配置
 <cache name="sampleCache2"
       maxElementsInMemory="1000"
       eternal="true"
       timeToIdleSeconds="0"
       timeToLiveSeconds="0"
       overflowToDisk="false"
       />
*在hibernate.cfg.xml文件中加入缓存产品提供商
<propertyname="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
* 启用二级缓存,这也是它的默认配置,在hibernate.cfg.xml配置文件中进行启动二级缓存配置.
<propertyname="hibernate.cache.use_second_level_cache">true</property>
*指定哪些实体类使用二级缓存
可以在映射文件中采用<cache>标签指定或在hibernate.cfg.xml文件中统一指定
注意使用的策略,通常采用read-only和read-write.
例如在配置文件中统一进行配置.(此处笔者将对Student类进行配置)
<class-cacheusage="read-only" class="com.tgb.hibernate.Student"/>
*以上便完成了EHCache的基本配置,接下来便是在具体的代码中运用
 例如在两个Session中发Load查询,因为我们配置了二级缓存,所以在第二次Load的过程中不在发出查询语句,而是直接从二级缓存中获取数据.
测试代码如下:
 
 
[java] 
/** 
 * 二级缓存测试代码 
 *  
 */  
  
public class CacheTest extends TestCase {  
  
    /** 
     * 开启二级缓存 
     * 在两个session中发load查询 
     */  
    public void testCache() {  
        Session session = null;  
        try {  
            //获取session  
            session = HibernateUtils.getSession();  
            //开启事务  
            session.beginTransaction();  
            //第一次用load查询id为1的学生  
            Student student = (Student)session.load(Student.class, 1);  
            System.out.println("student.name=" + student.getName());  
            //提交  
            session.getTransaction().commit();  
        }catch(Exception e) {  
            e.printStackTrace();  
            session.getTransaction().rollback();  
        }finally {  
            HibernateUtils.closeSession(session);  
        }  
          
        try {  
            session = HibernateUtils.getSession();  
            session.beginTransaction();  
            第二次用load查询id为1的学生  
            Student student = (Student)session.load(Student.class, 1);  
              
            //不会发出查询语句,因为配置二级缓存,session可以共享二级缓存中的数据  
            //二级缓存是进程级的缓存  
            System.out.println("student.name=" + student.getName());  
            session.getTransaction().commit();  
        }catch(Exception e) {  
            e.printStackTrace();  
            session.getTransaction().rollback();  
        }finally {  
            HibernateUtils.closeSession(session);  
        }  
          
    }         
  
}  
 
补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,