码迷,mamicode.com
首页 > 其他好文 > 详细

二级缓存

时间:2015-05-27 09:53:17      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:

1.基本概念

  • 当hibernate容器启动的时候,二级缓存就存在了,只有当hibernate容器关闭的时候,二级缓存才要销毁。
  • 二级缓存中的数据是公有数据,任何人都能访问。
  • 类似火车的票务信息、飞机的票务信息都可以放入到二级缓存中
  • 二级缓存存放的数据应该是经常不修改的数据

2.特点

  • 是借助第三方插件实现的二级缓存。例如:ehcache实现

3.配置步骤(hibernate.cfg.xml)

    指定二级缓存的供应商
        <property name="cache.provider_class">
            org.hibernate.cache.EhCacheProvider
        </property>
    开启二级缓存
        property name="cache.use_second_level_cache">true</property>
    开启hibernate的统计机制
        <property name="hibernate.generate_statistics">true</property>
    指针某一个类开启二级缓存(在对象映射文件中配置)
        <class name="com.sn.domain.Classes">
            <cache usage="read-only"/>

4.放入二级缓存

/**
     * session.get方法不仅要把对象放入到一级缓存,而且放入到二级缓存
     */
    @Test
    public void test2(){
        Session session = sessionFactory.openSession();
        Classes classes = (Classes) session.get(Classes.class, 1L);
        session.close();
        session = sessionFactory.openSession();
        Classes classes2 = (Classes) session.get(Classes.class, 1L); //不打印sql语句
        System.out.println(session.getStatistics().getEntityCount());    //1
        System.out.println(sessionFactory.getStatistics().getEntityLoadCount()); //1
        session.close();
    }
    
    /**
     * session.save() 只操作一级缓存,没有操作二级缓存
     * session.update() 同上
     */
    @Test
    public void test3(){
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        Classes classes = new Classes();
        classes.setName("aaaa");
        classes.setDescription("aaaaaaaa");
        session.save(classes);
        System.out.println(session.getStatistics().getEntityCount());    //1
        System.out.println(sessionFactory.getStatistics().getEntityLoadCount()); //0
        transaction.commit();
        session.close();
    }
    
    /**
     * session.createQuery("from Classes").list()该方法可以把一些对象放入到二级缓存中
     */
    @Test
    public void test4(){
        Session session = sessionFactory.openSession();
        session.createQuery("from Classes").list();
        System.out.println(session.getStatistics().getEntityCount());    //1
        System.out.println(sessionFactory.getStatistics().getEntityLoadCount()); //0
        session.close();
    }

 5.缓存到磁盘

   在根目录添加 ehcache.xml文件

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
         
    <diskStore path="e:\\TEMP1"/>
    <defaultCache
            maxElementsInMemory="12"  //内存中存放对象最大的个数
            eternal="false"
            timeToIdleSeconds="1200"
            timeToLiveSeconds="1200"
            overflowToDisk="false"     //如果内存中的对象超过最大个数,是否缓存到磁盘上
            maxElementsOnDisk="10000000" //磁盘上能够缓存的最大对象个数
            diskPersistent="false"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU"
            />
       <Cache
            name="com.sn.domain.Classes"
            maxElementsInMemory="3" 
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="true"
            maxElementsOnDisk="10000000"
            diskPersistent="false"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU"
            />
</ehcache>
   测试: 
  @Test
public void test1() throws InterruptedException{ Session session = sessionFactory.openSession(); session.createQuery("from Classes").list(); System.out.println(sessionFactory.getStatistics().getEntityLoadCount()); session.close(); Thread.sleep(1000L); }
在E盘下产生
TEMP1文件夹,里面保存着缓存数据

 

二级缓存

标签:

原文地址:http://www.cnblogs.com/jsnan/p/4532507.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!