在hibernate当中重点比较了find及iterate的使用,主要是他们在查询数据时的优劣势的比较,而由session.find()方法也引申出了query cache这个概念及对find在查询时的劣势的解闷方案。虽然query cache在使用上还是有很多的局限,但是它对提高find的性能起到了很大的作用。
在Hibernate2.0当中使用:session.find(),session.iterate(),而hibernate3.0当中使用的是query.find(),query.iterate()来代替。
下面我们着重分析一下这两个方法的使用:
1. 如果我们在使用find,iterate进行查询时分别构建他们的HQL,那么我们在控制台输出当中看到iterate()方法所使用的SQL语句的次数要远远超过Find()。
但是,为什么iterate()还存在呢?
2. 当我们在使用find构建HQL后,而同样的查询也让iterate()来执行一次的话(前提是必须使用find()构建的HQL),那么iterate()的执行并不再像前面介绍的那样会比find()方法多执行SQL,而是根本再执行一条SQL。这就是iterate()方法的使用。它使用了Hibernate缓存机制.Find()方法在查询出结果后把查询结果集置入缓存,而iterate()执行的时候先执行一条Select SQL,查询所有符合条件的结果集,接下来iterate()根据查询的id在本地缓存中查找符合条件的结果集,如果有完全符合条件的结果集,则直接以此作为返回结果。如果没有找到再执行相应的SQL,并且把结果纳入缓存当中。以备使用
3.缓存机制并不对find()方法起使用。如果你两次执行相同条件的或相近条件的HQL,第二个方法的SQL并不减少。还会照常执行。这就是说缓存机制并不对find()方法起作用。find()对缓存只写不读,而iterate()方法就可以充分利用缓存的优势。
4.内存方面的考虑,除了缓存的优势之外,我们还可以利用iterate()与evict()方法来提升查询性能上的优势。
这个问题主要是大数据量所带来的考虑。因为find()方法可以对大数据量的结果集进行缓存,但是如果数据量超大的话,也会带来内存溢出方面的问题。利用iterate(),evict()可以对记录进行逐条处理,将内存消耗保持在可接受的范围之内。
它包括从session中消除对对象,及从sessionFactory当中消除对象。
5. 对于find()方法在读取缓存问题方面的解决。Query Cache是一个解决方案,不过目前的使用受限比较大。
使用Query Cache的条件是:
A。数据库表结构不变。即未发生过update,insert,delete等操作
B。相同的HSQL的重复执行操作。
由于以上两个原因,query Cache的使用上受到了很大 的限制。
如果想使用query cache我们需要配置 hibernate.cfg.xml文件:
<class ......>
<property nam="hibernate,cache.use_query_cache">True</property>
</class>
在编码当中使用:Query.setQueryCache(true);即可。
posted on 2006-07-25 16:03
水煮三国 阅读(3571)
评论(0) 编辑 收藏 所属分类:
Hibernate