了解Hibernate的FlushMode.NEVER

http://tech.ddvip.com   2006年11月20日    社区交流

本文详细介绍了解Hibernate的FlushMode.NEVER

  幸好,这个杀手不太“冷”!这都归结于Hibernate的脏检查(dirty checking)。每次装载一个对象到内存(不能去evict它)时,session始终跟踪它的修改。于是每次对数据的查询,session都将跌代所有的session中的对象并检查脏数据,将脏数据flush到数据库。Hibernate这样做的良苦用心是为了确保在执行查询之前所有可能影响查询的变化都被提交到数据库。这对零星数据量的应用来讲,不足为言。但面对数千个对象和千余次的查询来讲,它将使性能的真正杀手。

  了解真相后,我们可以使用session.setFlushMode(FlushMode.NEVER)语句将在查询时不需脏检查的数据(生物实验中的Primers)标识脏数据,这样Hibernate无处不在的代理机制将被“欺骗”,直接将它添加到脏数据列表(列表中的数据不会被flush到数据库)中,这样“杀手”就会因无处遁形而自动消失了。

  四、打造制胜武器:

  

  图片来自于电影《致命武器3》

  在读完这个简短的“案件”后,我们也学到了如何在一个session中读取、查询大量数据对象情况下的制胜武器- FlushMode.NEVER。当然要记住,在此过程中你不可以修改这些数据,不然就真的把数据“搞脏”了。

  使用武器秘诀如下:

  FlushMode previous = session.getFlushMode();
  session.flush(); // who know's what been done till now
  session.setFlushMode(FlushMode.NEVER);
  // Do some querying
  // Do some more querying
   // Really load up that session
   // Execute a few more queries
  // Write back to some tables
  session.flush();
  session.setFlushMode(previous);

责编:豆豆技术应用

正在加载评论...