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();
*/

时间: 2024-10-12 12:29:07

hibernate二级缓存ehcache的相关文章

Hibernate二级缓存以及ehcache的搭建配置

前言 这次主要复习Hibernate的二级缓存的相关知识,配置以及使用.二级缓存主要采用第三方的ehcache,也将介绍ehcache缓存的相关配置属性以及在项目中的搭建,具体的项目查看下一篇的 Maven搭建SpringMVC+Hibernate项目详解 的文章.(之前使用过Hibernate的二级缓存,但是没自己搭建和研究过,现在花了半天时间搭建了一下,写下来供大家参考) 1.Hibernate二级缓存 Hibernate包括两个级别的缓存: 1.一级缓存:默认总是启用的session级别的

Hibernate二级缓存的使用

1启用Hibernate二级缓存 Hibernate二级缓存分为两部分,class缓存和查询缓存,其获取对象的方式有所不同,但两者也有联系,查询缓存必须以class缓存为基础才能起作用,否则只会使效率更低. 我们这里使用的二级缓存是通过ehcache第三方插件实现的. 1.1配置Hibernate.cfg.xml 启用class缓存: <property name="hibernate.cache.provider_class"> org.hibernate.cache.E

Hibernate ——二级缓存

一.Hibernate 二级缓存 1.Hibernate 二级缓存是 SessionFactory 级别的缓存. 2.二级缓存分为两类: (1)Hibernate内置二级缓存 (2)外置缓存,可配置的,可插拨的,外置缓存中的数据是数据库数据的复制. 3.二级缓存的并发访问策略 (1)两个并发的事务同时访问持久层的缓存的相同数据时,也有可能出现并发问题. (2)二级缓存可以设定以下 4 中并发访问策略,每一种对应一种事务隔离级别. 非严格读写(Nonstrict-read-write):不保证缓存

Hibernate4.1.4配置二级缓存EHCache步骤

1.当然首先引入EHCache相关的jar包 这些包不需要另外下载,在Hibernate官方网站下载Hibernate4.1.7的压缩包(如:hibernate-release-4.1.7.Final.zip)解压,引入hibernate-release-4.1.7.Final\hibernate-release-4.1.7.Final\lib\optional\ehcache目录下的ehcache-core-2.4.3.jar.hibernate-ehcache-4.1.4.Final.jar

Hibernate 二级缓存 总结整理(转)

和<Hibernate 关系映射 收集.总结整理> 一样,本篇文章也是我很早之前收集.总结整理的,在此也发上来 希望对大家有用.因为是很早之前写的,不当之处请指正. 1.缓存:缓存是什么,解决什么问题? 位于速度相差较大的两种硬件/软件之间的,用于协调两者数据传输速度差异的结构,均可称之为 Cache(摘自Robbin的<缓存技术浅谈>).目的:让数据更接近于应用程序,协调速度不匹配,使访问速度更快.(请参考http://baike.baidu.com/view/907.htm 了

Hibernate(十六):Hibernate二级缓存(一)

Hibernate缓存 缓存(Cache):计算机领域非常通用的概念.它介于应用程序和永久性数据存储源(如磁盘上的文件或者数据库)之间,起作用是降低应用程序直接读取永久性数据存储源的频率,从而提高应用的运行性能.缓存中的数据是数据存储源中数据的拷贝.缓存的物理介质通常是内存. Hibernate中提供了两个级别的缓存 1)第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存.这一级别的缓存由hibernate管理. 2)第二级别的缓存是SesssionFactory级别的缓存,它是属

Ehcache 实现 Hibernate 二级缓存策略

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

Hibernate二级缓存

第一级缓存:事务范围的缓存.Session缓存.存放元数据和预定义SQL.只读缓存. 第二级缓存:进程范围或者集群范围.由SessionFactory负责管理.SessionFactory的外置缓存.SessionFactory这个级别维护的缓存.二级缓存是针对整个应用而不是某个特定的session. Session 如何判断持久化对象的状态的改变呢? Session 加载对象后会为对象值类型的属性复制一份快照.当Session 清理缓存时,比较当前对象和它的快照就可以知道那些属性发生了变化.

hibernate二级缓存攻略(转)

很多人对二级缓存都不太了解,或者是有错误的认识,我一直想写一篇文章介绍一下hibernate的二级缓存的,今天终于忍不住了. 我的经验主要来自hibernate2.1版本,基本原理和3.0.3.1是一样的,请原谅我的顽固不化. hibernate的session提供了一级缓存,每个session,对同一个id进行两次load,不会发送两条sql给数据库,但是session关闭的时候,一级缓存就失效了. 二级缓存是SessionFactory级别的全局缓存,它底下可以使用不同的缓存类库,比如ehc