Session Clear()与 Flush() 解释

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

例:

  1. public void testClear(){
  2. Session session =  HibernateUitl.getSessionFactory().getCurrentSession();
  3. session.beginTransaction();
  4. Teacher t = (Teacher) session.get(Teacher.class, 3);
  5. System.out.println(t.getName());
  6. Teacher t2 = (Teacher) session.get(Teacher.class, 3);
  7. System.out.println(t2.getName());
  8. session.getTransaction().commit();
  9. }

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

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

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

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

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

例:

  1. @Test
  2. /**
  3. * flush 强制与数据库同步
  4. */
  5. public void testFlush(){
  6. Session session =  HibernateUitl.getSessionFactory().getCurrentSession();
  7. session.beginTransaction();
  8. Teacher t = (Teacher) session.get(Teacher.class, 3);
  9. t.setName("yyy");
  10. t.setName("yyyyy");
  11. session.getTransaction().commit();
  12. }

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

[java] view plain copy
  1. @Test
  2. /**
  3. * flush 强制与数据库同步
  4. */
  5. public void testFlush(){
  6. Session session =  HibernateUitl.getSessionFactory().getCurrentSession();
  7. session.beginTransaction();
  8. Teacher t = (Teacher) session.get(Teacher.class, 3);
  9. t.setName("yyy");
  10. session.flush();//有flush会执行2次UPDAE,没有会只执行一次
  11. t.setName("yyyyy");
  12. session.getTransaction().commit();
  13. }



 

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

再看hibernate 执行的sql 语句

  1. Hibernate:
  2. update
  3. Teacher
  4. set
  5. birthday=?,
  6. name=?,
  7. title=?
  8. where
  9. id=?
  10. Hibernate:
  11. update
  12. Teacher
  13. set
  14. birthday=?,
  15. name=?,
  16. title=?
  17. where
  18. 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只做查询时,就可以不让他与数据库同步了。

Session的clear方法和flush方法的更多相关文章

  1. Junit 注解 类加载器 .动态代理 jdbc 连接池 DButils 事务 Arraylist Linklist hashset 异常 哈希表的数据结构,存储过程 Map Object String Stringbufere File类 文件过滤器_原理分析 flush方法和close方法 序列号冲突问题

    Junit 注解 3).其它注意事项: 1).@Test运行的方法,不能有形参: 2).@Test运行的方法,不能有返回值: 3).@Test运行的方法,不能是静态方法: 4).在一个类中,可以同时定 ...

  2. Hibernate中Session.get()方法和load()方法的详细比较

    一.get方法和load方法的简易理解  (1)get()方法直接返回实体类,如果查不到数据则返回null.load()会返回一个实体代理对象(当前这个对象可以自动转化为实体对象),但当代理对象被调用 ...

  3. flush方法和close方法的区别

    package com.yhqtv.demo05.Writer; import java.io.FileWriter; /* * @author XMKJ yhqtv.com Email:yhqtv@ ...

  4. flush方法和close方法的区别和字符输出流写数据的其他方法和字符输出流的续写和换行

    flush方法和close方法的区别 flush:刷新缓冲区,流对象可以继续使用 close:先刷新缓冲区,然后通知系统释放资源.刘对象不可以再被使用了. public class demo02 { ...

  5. Android HTTP实例 使用GET方法和POST方法发送请求

    Android HTTP实例 使用GET方法和POST方法发送请求 Web程序:使用GET和POST方法发送请求 首先利用MyEclispe+Tomcat写好一个Web程序,实现的功能就是提交用户信息 ...

  6. 序列化和持久化 merge方法和saveOrUpdate方法

    merge方法和saveOrUpdate方法的区别 merge方法是把我们提供的对象转变为托管状态的对象:而saveOrUpdate则是把我们提供的对象变成一个持久化对象:说的通俗一点就是:saveO ...

  7. ASP.NET Core 中文文档 第二章 指南(4.10)检查自动生成的Detail方法和Delete方法

    原文 Examining the Details and Delete methods 作者 Rick Anderson 翻译 谢炀(Kiler) 校对 许登洋(Seay).姚阿勇(Mr.Yao) 打 ...

  8. ThinkPHP的D方法和M方法的区别

    M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 ...

  9. virtual方法和abstract方法

    在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Virtual方法(虚方法) virtual ...

随机推荐

  1. javascript之QUnit单元测试

    一.javascript也需要单元测试吗? 这里我并不知道你有没有开发过大型的javascript项目,至今我开发过三个大型的js项目,分为是<课程节点树管理>.<在线制作试卷> ...

  2. 12、java5锁java.util.concurrent.locks.Lock之ReentrantLock

    JDK文档描述: public interface LockLock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作.此实现允许更灵活的结构,可以具有差别很大的属性,可 ...

  3. Lotus Domino和关系型数据库(LEI,DESC,JDBC连接)

    Domino和关系数据库进行交互是日常项目开发中经常涉及到的一个方面,每个domino开发人员都写过这样的程序,本文就这个方面做一下简单的总结. 一.工具篇 1.使用LEI(Lotus Enterpr ...

  4. js动态创建HTML(radio、checkbox...)[摘抄]

    function create(parentId,eleType,eleName,eleId,eleValue){ var board = document.getElementById(parent ...

  5. 【RS】Local Collaborative Ranking - LCR: 局部协同排序

    [论文标题]Local Collaborative Ranking   (WWW '14 23rd WWW ) [论文作者]Joonseok [论文链接]Paper(11-pages // Doubl ...

  6. 观文章《Linux系统管理员修炼三层次》有感

     层次,都不陌生,通俗讲,就是和档次挂钩的,初入江湖时,都想自己几年后,武艺精深,深藏百技,忙时带领团队打BOSS,闲时喝酒论道,博古纵今,想想都令人精神满满,干劲十足!!! 至今已入江湖几载,回首来 ...

  7. 怎样看待IT界业务,技术,管理的各自比重

    怎样看待IT界业务,技术,管理的各自比重   技术是根本,业务是个人能力的体现,管理一般随意,追求简单,眼光向IBM等有优秀管理经验的大公司看齐   重点从个人的喜好.性格方面来考虑分配比重,可以加上 ...

  8. Redis学习之路(007)- Redis学习手册(实例代码)

    在之前的博客中已经非常详细的介绍了Redis的各种操作命令.运行机制和服务器初始化参数配置.本篇博客是该系列博客中的最后一篇,在这里将给出基于Redis客户端组件访问并操作Redis服务器的代码示例. ...

  9. SpringBoot配置属性之Security

    SpringBoot配置属性系列 SpringBoot配置属性之MVC SpringBoot配置属性之Server SpringBoot配置属性之DataSource SpringBoot配置属性之N ...

  10. 【Oracle】Oracle约束的总结

    你对ORACLE约束的了解如何?比较模糊还是相当透彻?如果你对下面几个问题了如指掌的话,恭喜你,你已经对约束掌握得比较好了,不用看这篇文章了.ORACLE的约束有啥功能作用? 有哪些类型约束(不同版本 ...