原因1.与hibernate缓存机制密切相关 find方法实际上是无法利用缓存的,它对缓存只写不读。 find方法只执行一次SQL查询,它无法判断缓存中什么样的数据是符合条件的,也无法保证查询结果的完整性。而iterate方法,会首先查询所有符合条件记录的id,然后根据id去缓存中找,如果缓存中有该id,就返回,没有可以根据id再去数据库查询。 String hql = "from TUser where age > ?"; List userList = session.find(hql, new Integer(18), Hibernate.INTEGER); Iterator it = session.iterate(hql, new Integer(18), Hibernate.INTEGER); 顺序执行,iterate方法只会执行一次SQL查询,就是查找id,然后根据id就可以从缓存中获得数据。
String hql = "from TUser where age > ?"; List userList = session.find(hql, new Integer(18), Hibernate.INTEGER); userList = session.find(hql, new Integer(18), Hibernate.INTEGER); 缓存是不起作用的。 如果目标数据读取相对较为频繁,通过iterate这种机制,会减少性能损耗。
原因2.内存使用上的考虑 find方法将一次获得的所有记录并将其读入内存。如果数据量太大,可能会触发OutOfMemoryError,从而导致系统异常。解决方案之一就是结合iterate方法和evict方法逐条对记录进行处理,将内存消化保持在一个可以接受的范围之内。如: String hql = "from TUser where age > ?"; Iterator it = session.iterate(hql, new Integer(18), Hibernate.INTEGER); while(it.hasNext()) { TUser user = (TUser)it.next();