hibernate二级缓存

hibernate二级缓存

二级缓存也称进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享
二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存

二级缓存的配置和使用:
    * 将echcache.xml文件拷贝到src下
    * 开启二级缓存,修改hibernate.cfg.xml文件(其实默认就是开启的)
        <property name="hibernate.cache.use_second_level_cache">true</property>
    * 指定缓存产品提供商,修改hibernate.cfg.xml文件
        <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
    * 指定那些实体类使用二级缓存(两种方法)
        * 在映射文件中采用<cache>标签(放在ID标签前面)
        * 在hibernate.cfg.xml文件中,采用<class-cache>标签(推荐使用这个方法)
        
二级缓存是缓存实体对象的

了解一级缓存和二级缓存的交互       


=======================================================
一 级缓存是伴随着session一起的,session消亡了,对应的一级缓存也就没有了,而二级缓存则不一样,不同的session是可以共享二级缓存 的!下面的程序,如果没有开启二级缓存,则会发两次sql,但开启后只会发一次,如果将下面的load换成get效果也是一样的
  1.     /**
  2.      * 开启两个session,分别调用load,(get和load也一样)
  3.      */
  4.     public void testCache1() {
  5.         Session session = null;
  6.         try {
  7.             session = HibernateUtils.getSession();
  8.             session.beginTransaction();
  9.             //get和load也一样
  10.             Student student = (Student)session.load(Student.class1);
  11.             System.out.println("student.name=" + student.getName());
  12.            
  13.             session.getTransaction().commit();
  14.         }catch(Exception e) {
  15.             e.printStackTrace();
  16.             session.getTransaction().rollback();
  17.         }finally {
  18.             HibernateUtils.closeSession(session);
  19.         }
  20.        
  21.         try {
  22.             session = HibernateUtils.getSession();
  23.             session.beginTransaction();
  24.            
  25.             //不会发出sql,因为开启了二级缓存,session是共享二级缓存的
  26.             Student student = (Student)session.load(Student.class1);
  27.             System.out.println("student.name=" + student.getName());
  28.            
  29.             session.getTransaction().commit();
  30.         }catch(Exception e) {
  31.             e.printStackTrace();
  32.             session.getTransaction().rollback();
  33.         }finally {
  34.             HibernateUtils.closeSession(session);
  35.         }
  36. ================================================================
  37.     /**
  38.      * 开启两个session,分别调用load,在使用SessionFactory清除二级缓存
  39.      */
  40.     public void testCache3() {
  41.         Session session = null;
  42.         try {
  43.             session = HibernateUtils.getSession();
  44.             session.beginTransaction();
  45.            
  46.             Student student = (Student)session.load(Student.class1);
  47.             System.out.println("student.name=" + student.getName());
  48.            
  49.             session.getTransaction().commit();
  50.         }catch(Exception e) {
  51.             e.printStackTrace();
  52.             session.getTransaction().rollback();
  53.         }finally {
  54.             HibernateUtils.closeSession(session);
  55.         }
  56.        
  57.         //管理二级缓存
  58.         SessionFactory factory = HibernateUtils.getSessionFactory();
  59.         //factory.evict(Student.class);  在这种情况下,会将所有的二级缓存全部清除,下面的只会清除指定的
  60.         factory.evict(Student.class1);
  61.        
  62.         try {
  63.             session = HibernateUtils.getSession();
  64.             session.beginTransaction();
  65.            
  66.             //会发出查询sql,因为二级缓存中的数据被清除了
  67.             Student student = (Student)session.load(Student.class1);
  68.             System.out.println("student.name=" + student.getName());
  69.            
  70.             session.getTransaction().commit();
  71.         }catch(Exception e) {
  72.             e.printStackTrace();
  73.             session.getTransaction().rollback();
  74.         }finally {
  75.             HibernateUtils.closeSession(session);
  76.         }
  77.     }
  78.    
  79.    
  80.     /**
  81.      * 一级缓存和二级缓存的交互
  82.      */
  83.     public void testCache4() {
  84.         Session session = null;
  85.         try {
  86.             session = HibernateUtils.getSession();
  87.             session.beginTransaction();
  88.            
  89.             //仅向二级缓存读数据,而不向二级缓存写数据
  90.             session.setCacheMode(CacheMode.GET);
  91.             Student student = (Student)session.load(Student.class1);
  92.             System.out.println("student.name=" + student.getName());
  93.            
  94.             session.getTransaction().commit();
  95.         }catch(Exception e) {
  96.             e.printStackTrace();
  97.             session.getTransaction().rollback();
  98.         }finally {
  99.             HibernateUtils.closeSession(session);
  100.         }
  101.        
  102.         try {
  103.             session = HibernateUtils.getSession();
  104.             session.beginTransaction();
  105.            
  106.             //发出sql语句,因为session设置了CacheMode为GET,所以二级缓存中没有数据
  107.             Student student = (Student)session.load(Student.class1);
  108.             System.out.println("student.name=" + student.getName());
  109.            
  110.             session.getTransaction().commit();
  111.         }catch(Exception e) {
  112.             e.printStackTrace();
  113.             session.getTransaction().rollback();
  114.         }finally {
  115.             HibernateUtils.closeSession(session);
  116.         }
  117.        
  118.         try {
  119.             session = HibernateUtils.getSession();
  120.             session.beginTransaction();
  121.            
  122.             //只向二级缓存写数据,而不从二级缓存读数据
  123.    // 如果此处不设置cachemode,但它不会发Sql因为上一个已经存了数据,它已经放到了二级缓存中,
  124.    //默认的情况下,是可以读取的,貌似此处的每一次设置cachemode只针对当前的session有效??
  125.             session.setCacheMode(CacheMode.PUT);
  126.            
  127.             //会发出查询sql,因为session将CacheMode设置成了PUT
  128.             Student student = (Student)session.load(Student.class1);
  129.             System.out.println("student.name=" + student.getName());
  130.            
  131.             session.getTransaction().commit();
  132.         }catch(Exception e) {
  133.             e.printStackTrace();
  134.             session.getTransaction().rollback();
  135.         }finally {
  136.             HibernateUtils.closeSession(session);
  137.         }
  138.        
  139.     }   
  140. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值