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. V-rep学习笔记:机器人模型创建2—添加关节

    下面接着之前经过简化并调整好视觉效果的模型继续工作流,为了使模型能受控制运动起来必须在合适的位置上添加相应的运动副/关节.一般情况下我们可以查阅手册或根据设计图纸获得这些关节的准确位置和姿态,知道这些 ...

  2. python模块之httplib(在py3中功能进一步强大,请详看文档)

    # -*- coding: utf-8 -*-#python 27#xiaodeng#python模块之httplib(在py3中功能进一步强大,请详看文档) import httplib#是较为底层 ...

  3. JUC-线程池调度-ScheduledThreadPool

    线程调度使用类:ScheduledExecutorService 创建线程池调度类对象: ScheduledExecutorService pool = Executors.newScheduledT ...

  4. SpringBoot与Dubbo整合的三种方式

    1. 使用默认application.properties和注解的方式 导入dubbo-starter,在application.properties配置属性,使用@Service注解来暴露服务,使用 ...

  5. Axure快速原型教程01--原型说明下载和安装

          Axure是一个快速画原型的工具         什么是原型?         估计进来的朋友应该都清楚,原型通俗来讲,不仅仅是在软件开发中使用,在很多行业中也需要用的,比如服装设计,建筑 ...

  6. 安装和使用solr

    下载Solr:wget http://apache.fayea.com/lucene/solr/6.4.1/solr-6.4.1.tgz解压:tar -zxvf solr-6.4.1.tgz bin/ ...

  7. Nginx 在ubuntu14.04下的安装

    来源:http://blog.csdn.net/hanshileiai/article/details/45580001 按照步骤一步一步来,绝对ok 1.如果出现错误: *4 connect() t ...

  8. Android MD5校验码的生成与算法实现

    在Java中,java.security.MessageDigest (rt.jar中)已经定义了 MD5 的计算,所以我们只需要简单地调用即可得到 MD5 的128 位整数.然后将此 128 位计 ...

  9. C#项目中引入app.manifest管理员权限运行

    原文地址:https://blog.csdn.net/qq395537505/article/details/51010962 参考UAC:User Account Control 参考IE保护模式: ...

  10. android studio Gradle Build速度加快方法

    设置离线编译就可以解决这个问题了.如下图所示: