首页 > 代码库 > hibernate二级缓存ehcache

hibernate二级缓存ehcache


<!-----------------hibernate二级缓存ehcache------------------------->
hibernate配置
 <prop key="hibernate.cache.use_query_cache">true</prop>
 <prop key="hibernate.cache.use_second_level_cache">true</prop>
 <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>


要缓存对象配置文件配置
 <cache usage="read-only" region="sampleCache1"/>
 针对一对多等关系时增加<cache usage="read-only"/>设置
 <set name="items" cascade="all-delete-orphan" inverse="true" lazy="false" fetch="join">
    <cache usage="read-only"/>


ehcache.xml配置
        <!--
        maxElementInMemory 表示该缓存中可以存放多少个对象
        eternal 表示是否设置这些放入二级缓存的对象为永久的(即放入即保存,不再清除)一般都为false
        timeToIdleSeconds 表示多少秒内,放入的对象没有被再次访问到,就清除掉
        timeToLiveSeconds 表示对象在缓存中的存活时间,此属性是为了让更多的活跃对象进入到缓存
        overflowToDisk 表示活跃对象超出最大值时,超出的对象是否要写入硬盘,用户缓解活跃用户较多的情况
         -->
  <cache name="sampleCache1"
       maxElementsInMemory="10000"
       eternal="false"
       timeToIdleSeconds="60"
       timeToLiveSeconds="2000000"
       overflowToDisk="false"
  />


hibernateTemplate下使用二级缓存
      template.setCacheQueries(true);
     
     //HibernateTemplate下的查询缓存
     List<User> list = template.find("from User");
     System.out.println("***testFind****"+list+" "+list.size()+"  "+list.get(0));
     
     //HibernateTemplate下的二级缓存
     User user = (User)template.load(User.class, "01");
     System.out.println(user);
      
     template.setCacheQueries(false);

 

 

 


测试:

 

     HibernateTemplate template = this.getHibernateTemplate();

     template.setCacheQueries(true);
        List<Order> list = template.find("from Order where id = ‘4028aabe4b486f83014b487030820001‘");
        System.out.println("***testFind****"+list+"  "+list.get(0).getItems());
        Set set = list.get(0).getItems();
        Item item = (Item)set.iterator().next();
        System.out.println(item.getProductName()+" "+item.getOrder().getOrderName());
     template.setCacheQueries(false);

/*     template.setCacheQueries(true);
     
     //HibernateTemplate下的查询缓存
     List<User> list = template.find("from User");
     System.out.println("***testFind****"+list+" "+list.size()+"  "+list.get(0));
     
     //HibernateTemplate下的二级缓存
     User user = (User)template.load(User.class, "01");
     System.out.println(user);
      
     template.setCacheQueries(false);
*/   


     
     /**
      * 查询缓存 ,第二次请求获取不同的数据库session
      */
/*     Session session = this.getSessionFactory().openSession();
     Query query = session.createQuery("select u.username from User u where u.userId = ‘01‘");
     query.setCacheable(true);
     List<Object[]> list = query.list();
     System.out.println(list+" "+list.get(0));
     session.close();
*/
     
     /**
      *  针对一对多关系只是把order缓存到二级缓存,其中的多方item没有进行缓存(在order配置文件里修改配置<cache usage="read-only"/>)
      */
/*     Session session = this.getSessionFactory().openSession();
     Transaction tran = session.beginTransaction();
     Order order = (Order)session.load(Order.class,"4028aabe4b486f83014b487030820001");
     System.out.println(order+" "+order.getId()+""+order.getItems());
     tran.commit();
     session.close();
*/

        /**
         * 同一个session,使用一级缓存,不同session(不同的请求获取数据库连接)使用二级缓存需要配置(针对单独对象不包含一对多等关系的)
         */
/*      Session session = this.getSessionFactory().openSession();
     Transaction tran = session.beginTransaction();
     User user = (User)session.load(User.class,"01");
     System.out.println(user+" "+user.getUsername());
//     User user1 = (User)session.load(User.class,"01");
//     System.out.println(user1+" "+user1.getUsername());
     tran.commit();
     session.close();
*/
     
      
   

 

 

 

 

 

 

 


 

hibernate二级缓存ehcache