zoukankan      html  css  js  c++  java
  • hibernate的flush()、refresh()、clear()针对一级缓存的操作的区别

    首先session是有一级缓存的,目的是为了减少查询数据库的时间,提高效率,一级缓存的生命周期和session是一样的,

    session.flush()和session.clear()就针对session的一级缓存的处理。

       简单的说,

    1 session.flush()的作用就是将session的缓存中的数据与数据库同步。

    2 session.clear()的作用就是清除session中的缓存数据(不管缓存与数据库的同步)。

    3.session.refresh():会强制发送select语句,以使session缓存中对象的状态和数据表中对应的记录保持一致。该方法的有效性需要配置事务的隔离级别为read commited(读已提交)。

    注意:

    执行完session.flush()时,并不意味着数据就肯定持久化到数据库中的,因为事务控制着数据库,如果事务提交失败了,缓存中的数据还是照样会被回滚的。

    举例:

    @Test   
        public void testFlush(){  
            Session session =  HibernateUitl.getSessionFactory().getCurrentSession();  
            session.beginTransaction();  
            Teacher t = (Teacher) session.get(Teacher.class, 3);  
            t.setName("yyy");  
       
            t.setName("yyyyy");  
            session.getTransaction().commit();  
        } 
    

      看这段代码,我们setName() 2次, 但程序只会更改数据库一次,在commit时。

    @Test    
        public void testFlush(){  
            Session session =  HibernateUitl.getSessionFactory().getCurrentSession();  
            session.beginTransaction();  
            Teacher t = (Teacher) session.get(Teacher.class, 3);  
            t.setName("yyy");  
            session.flush();//有flush会执行2次UPDAE,没有会只执行一次  
            t.setName("yyyyy");  
            session.getTransaction().commit();  
        } 
    

      我们在第2次setName()时 执行session.flush().

    再看hibernate 执行的sql 语句
    
    Hibernate:   
        update  
            Teacher   
        set  
            birthday=?,  
            name=?,  
            title=?   
        where  
            id=?  
    Hibernate:   
        update  
            Teacher   
        set  
            birthday=?,  
            name=?,  
            title=?   
        where  
            id=?  
    

      

    执行了2次Update

    所以看出来flush方法会强制与数据库同步。

  • 相关阅读:
    cocos2d中sprite动画接口及动画实现思路总结
    iOS开发:小技巧积累
    cocos2d使用定时器
    Eclipse报错:cannot connect to VM
    Myeclipse console 端没有 tomcat 启动的log信息
    MyEclipse Web项目不能自动编译
    在MyEclipse中如何查看Spring/Hibernate/Struts/JDK等源码的方法
    【KMS】查看Windows的环境变量
    【KMS】如何预防用户多次点击提交按钮
    MyEclipse中选择一行的快捷键
  • 原文地址:https://www.cnblogs.com/baizhanshi/p/7685398.html
Copyright © 2011-2022 走看看