了解Hibernate的FlushMode.NEVER2011-01-05一、案件背景:

图片来自于电影《天生杀人狂》Hibernate并没有为巨型数据集合提供良好的帮助,这也许是开发者认为这样没有太大必要,反而增加Hibernate框架复杂性的缘故吧。于是“极大数据量==批量处理”、“Hibernate/java不是批处理的最佳场所”的观念在Hibernate开发中大行其道,有些开发者甚至直接利用Hibernate建立session,获取其connection进而进行jdbc操作。Jdbc并不是古董,但在Hibernate中再次call它,难免有些令人无奈。最近在Hibernate的官方坛子上看到Gavin写给初级用户的“understand FlushMode.NEVER”,并参考了一下Stripes项目(本人时常关注的时髦项目)作者Tim的blog。在阅读两位大家言论后,和大家share一下。二、性能杀手何在?

图片来自于电影《这个杀手不太冷》Tim在其Blog写道:“我目前的DNA重组系统,具有复杂而海量的OLTP数据,对付这些在内存的复杂对象(数千个)的方式是依赖用户接口(非批量处理)来实现用例驱动。”这句半开玩笑的话,是我想起了那男耕女织的生产力低下的生活,真的让每个开发者都使用算盘运算吗?session.setFlushMode(FlushMode.NEVER);这条语句及其简单,但解决了大问题。它告知Hibernate session无论何时也不要flush任何的状态变化到数据库,除非开发者直接调用session.flush()。听上去很合乎逻辑,但它为何在一些场景中对性能影响甚深,而在其他的场景中却好似轻如鹅毛般?