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. 江南白衣整理和开发的java常用工具类

    江南白衣的公众号的介绍文章:http://mp.weixin.qq.com/s/6JUo1vmUa-7SuDH6yIxKeQ github的地址:https://github.com/springsi ...

  2. 使用Maven Jenkins和JMeter自动化测试

      有两个插件能够实现在Maven build集成Jmeter测试, jmeter-maven-plugin 和 chronos-maven-plugin. 选择哪一个取决于情况,下面是一些判断标准: ...

  3. CSS3 flex的使用方法

    display:flex; align-items://水平对齐方式 justify-content://垂直对齐方式 flex://盒子所占大小(如果你盒子里面只有两个div,那么你设置其中之一个f ...

  4. Uploadify in ASP.Net

    和分页类似,文件上传是web开发标配的技能之一.下面介绍Uploadify的配置和使用. 一.配置 首先到Uploadify官网下载,然后在项目中添加相应引用.前台代码如下: 1.jquery.js2 ...

  5. Echart示例

    echart.html:  需要注意js文件加载的顺序 <!DOCTYPE html> <html lang="en"> <head> < ...

  6. ubuntu(14.04) 下安装yaf拓展

    #wget http://pecl.PHP.net/get/yaf-2.2.9.tgz #tar zxvf yaf-.tgz #cd yaf- [root@bogon yaf-]# whereis p ...

  7. 【ASP.NET】ASP.NET如何发布Web项目

    1.右击需要发布的项目,选择 属性>应用程序 在目标框架中选择.NET的版本,选择的版本的要本机安装的版本相符合,通常可以在“C:\Windows\Microsoft.NET\Framework ...

  8. 【Hibernate】hibernate框架的搭建

    1, Hibernate 是什么 Hibernate是java应用程序与数据库交互的开发的框架. Hibernate是一个开源,轻量级的ORM(对象关系映射)工具. 2,Hibernate框架的优点 ...

  9. excel文档中数据导入sql server注意事项

    进来经常需要对一些基础数据进行更新,而业务方提供的数据源往往都是excel,所以经常需要将excel中数据导入到 数据库临时表,然后再进行处理. 在导入过程中,发现有些数据比如手机号码,如果默认导入, ...

  10. Python学习笔记009—函数

    1. 空函数 如果想定义一个什么事也不做的空函数,可以用pass语句: def nop(): pass pass语句什么都不做,那有什么用?实际上pass可以用来作为占位符,比如现在还没想好怎么写函数 ...