hibernate一个Session有一个Cache,cache屏蔽了应用程序直接去访问数据库,如果同一张table的同一row在先前已经被请求过,那么为何下次请求的时候还要去请求一次呢,把前面的cache住,再遇到这样的请求直接返回cache里边的即可。
cache里边的数据如果含有脏数据,需要跟数据库同步(也就是需要hibernate来发送update, delete, insert),调用session.flush()达到此目的。一般情况下,hibernate在一个tx.commit()的时候会自动调用session.flush();也可以应用程序手动调用session.flush()来立刻将session的脏数据提交。
Session session = HibernateSessionFactory.currentSession();
Transaction tx = session.beginTransaction();
try{
Employee employee1 = (Employee)session.load(Employee.class, new Integer(3));
System.out.println(employee1);
employee1.setAge((byte)98);
session.flush();//发送employee1的update给数据库
// employee1.setAge((byte)43);
tx.commit();//employee1已经被flush过,不会再被flush。如果把上面以行代码注释取消,还会再发一条update语句。
}
catch(HibernateException e){
e.printStackTrace();
tx.rollback();
}
tx = session.beginTransaction();
Employee employee2 = (Employee) session.load(Employee.class, new Integer(3));
employee2.setGender('f');
System.out.println(employee2);
tx.commit();
session.flush()的动作执行的时候,session中cache不会被清空,所以上面的employee2和employee1返回的还是同一个实例。
那些被flush()过的对象不会在下次flush()的时候再被flush()一次,除非两次flush()中间又产生了新的脏数据。
我认为应用程序基本上不需要显示去调用session.flush();而交给tx.commit()去做就可以了。原因是:手动调用session.flush()虽然是往数据库提交了update等sql语句,但是这些update真正的commit是在tx.commit()执行的时候。所以手动session.flush()后,其他的session或者是其他的应用程序看到的仍然还是数据库以前的数据。(可以试验)
分享到:
相关推荐
博文链接:https://llying.iteye.com/blog/221702
首先session是有一级缓存的,目的是为了...3.session.refresh():会强制发送select语句,以使session缓存中对象的状态和数据表中对应的记录保持一致。该方法的有效性需要配置事务的隔离级别为read commited(读已提交)。
14.1. 批量插入(Batch inserts) 如果要将很多对象持久化,你必须通过经常的调用 flush() 以及稍后调用 ...session.flush(); session.clear(); } } tx.commit(); session.close(); 14.2. 批量更新(Batch updates)
Response.Flush()实现对服务端文件的下载时,会失败,不能正常弹出IE下载框,通过测试发现时浏览器的安全设置问题,如下操作便可解决
此时我们就会用到Response.flush()。他会将缓冲区中编译完成的数据先发送到客户端。 但是有很多时候,我们发现即使我们使用了Response.Flush(),但是并没有将前面的信息发到客户端来显示。呈献给我们的依然是白屏。...
如果你知道Response.Flush和Response.Clear,那你就可以不用这样的等待了。每生成一个Html页面,就用Response.write立即返回一条信息,提示该条数据库记录已经生成Html。
对hibernate的flush机制有兴趣可以看看
session.flush(); return null; } }); } ``` 在上面的代码中,我们使用 `HibernateCallback` 接口来执行原生 SQL 语句,该接口提供了一个 `doInHibernate()` 方法,该方法将在 Hibernate 事务中执行。我们可以在...
out.flush(); out.close(); out.write(parameters.getBytes(),0,parameters.getBytes().length); InputStream in = hc.getInputStream(); InputStreamReader reader = new InputStreamReader(in,"gb...
MySQL Flush 命令用法详解 MySQL Flush 命令是 MySQL 中的一种非常重要的命令,它可以用于清除或重新加载各种高速缓存、表或者获取锁等。执行 Flush 命令必须要有 reload 权限。今天,我们将详细介绍 MySQL Flush ...
FormerOpen.Flush(); //清空缓存 ToFileOpen.Write(buffer, 0, (int)FormerOpen.Length); //写入字节 ToFileOpen.Flush(); //清空缓存 FormerOpen.Close(); //释放所有资源 ...
3.8.3. 在 JTA 环境下使用 Current Session context(当前 session 上下文) 管理 .................................................................. 48 3.8.4. JMX 部署 ........................................
sys.stdout.flush() if verbose: sys.stdout.write('\r') sys.stdout.flush() 一般我们在训练神经网络模型的时候,都是每隔多少步,输出打印一下loss或者每一步打印一下loss,今天发现了另一种记录loss变化的...
NULL 博文链接:https://nethub2.iteye.com/blog/2023937
可以用于安全地观察APK包的行为,具体使用方法参见官网http://code.google.com/p/droidbox/
一个精简、全面、方便的AndroidLog库--ALog
MD5 加密 解密 public string EnCode(string data) { byte[] byKey = System.Text.... sw.Flush(); cst.FlushFinalBlock(); sw.Flush(); return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length); }
Functions to sequence FLUSH and FUA writes driver for Linux