posts - 89,  comments - 98,  trackbacks - 0

在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 水煮三国 阅读(3562) 评论(0)  编辑  收藏 所属分类: Hibernate

只有注册用户登录后才能发表评论。


网站导航:
 
<2006年7月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

常用链接

留言簿(4)

随笔分类(85)

随笔档案(89)

文章分类(14)

文章档案(42)

收藏夹(37)

java

oracle

Sybase

搜索

  •  

积分与排名

  • 积分 - 207814
  • 排名 - 267

最新评论

阅读排行榜

评论排行榜