zoukankan      html  css  js  c++  java
  • Session的clear方法和flush方法

    转载于:http://blog.csdn.net/lssssss/article/details/6839633

        http://blog.csdn.NET/lssssss/article/details/6839633

    1.Clear 方法
      无论是Load 还是 Get 都会首先查找缓存(一级缓存) 如果没有,才会去数据库查找,调用Clear() 方法,可以强制清除Session缓存。

    public void testClear(){  
            Session session =  HibernateUitl.getSessionFactory().getCurrentSession();  
            session.beginTransaction();  
            Teacher t = (Teacher) session.get(Teacher.class, 3);  
            System.out.println(t.getName());  
            Teacher t2 = (Teacher) session.get(Teacher.class, 3);  
            System.out.println(t2.getName());  
            session.getTransaction().commit();  
        }  

    这里虽然用了2个get方法(get方法会立即执行sql语句),但因为第一次执行了会缓存一个ID为3的实体,所以虽然有2个get方法只执行一次SQL语句。

    public void testClear(){  
            Session session =  HibernateUitl.getSessionFactory().getCurrentSession();  
            session.beginTransaction();  
            Teacher t = (Teacher) session.get(Teacher.class, 3);  
            System.out.println(t.getName());  
            session.clear();//这里不clear只会执行一次sql语句,有clear会执行2次  
            Teacher t2 = (Teacher) session.get(Teacher.class, 3);  
            System.out.println(t2.getName());  
            session.getTransaction().commit();  
        }  

    这里在第2次get前执行session.clear(),我们把hibernate show_sql 出来,它就会执行2次sql语句了。

    所以session.clear()会清除缓存。

    2.Flush方法
      可以强制进行从内存到数据库的同步。

    例:

    @Test  
        /** 
         * flush 强制与数据库同步 
         */  
        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  
        /** 
         * flush 强制与数据库同步 
         */  
        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方法会强制与数据库同步。


    Flush方法是可以设置的,也就是fulsh什么时候执行是可以设置的

     在session.beginTransaction前设置FlushMode

    session.setFlushMode(FlushMode.Always|AUTO|COMMIT|NEVER|MANUAL)

    FlushMode有5个值可选

    Always:任何代码都会Flush
    AUTO:默认方式–自动
    Commit:COMMIT时
    Never:始终不
    MANUAL:手动方式

    设置FlushMode 有个好处是可以节省开销,比如默认session只做查询时,就可以不让他与数据库同步了。

    注意的地方:

    1 session.clear()的作用是只清除session中的缓存数据,但不管缓存与数据库的同步。

    比如,你执行了

    Po po = new Po();

    session.save(po),

    之后马上执行session.clear(),在事务结束的时候,这条数据是不会被持久化到数据库中的,因为一般缓存是在事务提交的时候进行清理的,当在清理缓存前就把缓存给清除了,自然就不会同步到数据库了。不过这个也有例外的情况,就是当对象使用native生成器来生成主键id时,当执行session.save()方法时,就会立马往数据库插入一条数据,这时候执行session.clear()也不会影响了。

    2 当更新或者保存大批量数据的时候,可以每固定数量的时候,进行清理缓存,同时清除缓存:

    for (int i = 0; i < 1000;i ++){

    if (i /20 == 0) {

      session.flush();

      session.clear();

    }

    }

    因为把大量的对象放到session缓存中会浪费大量的内容空间。

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

  • 相关阅读:
    ASP.NET 表单验证 Part.1(理解表单验证)
    Silverlight 简介 Part.3(设计 Siverlight 页面)
    ASP.NET 成员资格 Part.3(LoginStatus、LoginView、PasswordRecovery)
    ASP.NET 网站部署 Part.1(安装IIS、复制文件部署网站)
    ASP.NET Dynamic Data Part.1(创建动态数据应用程序)
    ASP.NET 安全模型 Part.2(SSL)
    ASP.NET MVC Part.2(扩展基本的 MVC 应用程序)
    ASP.NET 网站部署 Part.2(使用 Web 部署)
    开发高级 Web 部件
    创建 Web 部件(WebPart 类、简单的 Web 部件)
  • 原文地址:https://www.cnblogs.com/L-a-u-r-a/p/7049666.html
Copyright © 2011-2022 走看看