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. Spring Boot 使用Jar打包发布, 并使用 Embedded Jetty/Tomcat 容器

    Jar包发布 在项目pom.xml中, 如果继承了Spring Boot的starter parent, 那么默认已经包含打包需要的plugins了, 设置为jar就能直接打包成包含依赖的可执行的ja ...

  2. 利用LD_PRELOAD hook代码

    loader在进行动态链接的时候,会将有相同符号名的符号覆盖成LD_PRELOAD指定的so文件中的符号.换句话说,可以用我们自己的so库中的函数替换原来库里有的函数,从而达到hook的目的.这和Wi ...

  3. Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)

    一段PHP程序执行报错: Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 261181 ...

  4. php使用wkhtmltopdf导出pdf

    参考:史上最强php生成pdf文件,html转pdf文件方法 http://biostall.com/wkhtmltopdf-add-header-footer-to-only-first-last- ...

  5. rsync配置及优化

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  6. 如何使两台机器不通过密码连接起来(linux)

    要求服务器10.96.22.40不通过密码直接连接服务器10.96.21.53 1:准备必须的软件 A:服务器40和53同时安装所需软件 yum -y install openssh-server o ...

  7. linux 监控性能学习笔记(1)

    top命令中的 load average后面的三个数字分别表示距离现在一分钟,五分钟,十五分钟的负载情况. 在单核系统中100%利用负载标识为1.00,双核系统标识2.00 四核系统标识为4.00 因 ...

  8. sort_area_size,sort_area_retained_size

    sort_area_sizeoracle不建议设置sort_area_size参数.除非实例被配置成了共享服务器模式.默认值已经足够满足大多数OLTP系统.如果是OLAP.批任务.创建大的索引,可能需 ...

  9. mysql的内存使用

    Mysql Server Memory Usage = Sum of Global Buffers + (number of Connection * Per thread memory variab ...

  10. 输出当前MySQL的环境变量:

    输出当前mysql的环境变量: > MySQL.exe --help >output.txt