session.flush()与session.clear()的区别及使用环境

[From] http://blog.csdn.net/leidengyan/article/details/7514484


首先session是有一级缓存的,目的是为了减少查询数据库的时间,提高效率,一级缓存的生命周期和session是一样的,


session.flush()和session.clear()就针对session的一级缓存的处理。
   简单的说,


1 session.flush()的作用就是将session的缓存中的数据与数据库同步。


2 session.clear()的作用就是清除session中的缓存数据(不管缓存与数据库的同步)。




   详细的说:网上很多这样的文章,我就不说了,可以看看这篇文章,写的很详细。http://blog.csdn.net/lssssss/article/details/6839633


我说一下一些需要注意的信息:


1 session.clear()的作用是只清除session中的缓存数据,但不管缓存与数据库的同步。


比如,你执行了


Po po = new Po();
session.save(po),


之后马上执行session.clear(),在事务结束的时候,这条数据是不会被持久化到数据库中的,因为一般缓存是在事务提交的时候进行清理的,当在清理缓存前就把缓存给清除了,自然就不会同步到数据库了。不过这个也有例外的情况,就是当对象使用native生成器来生成主键id时,当执行session.save()方法时,就会立马往数据库插入一条数据,这时候执行session.clear()也不会影响了。


2 当更新或者保存大批量数据的时候,可以每固定数量的时候,进行清理缓存,同时清除缓存:


for (int i = 0; i < 1000;i ++){


if (i /20 == 0) {


  session.flush();


  session.clear();
}
}


因为把大量的对象放到session缓存中会浪费大量的内容空间。




3 执行完session.flush()时,并不意味着数据就肯定持久化到数据库中的,因为事务控制着数据库,如果事务提交失败了,缓存中的数据还是照样会被回滚的。
原文地址:https://www.cnblogs.com/pekkle/p/6568684.html