<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/hibernate2-find-and-iterate-vs-html/</link>
<title><![CDATA[hibernate2中find和iterate方法的区别]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[编程杂谈]]></category>
<pubDate>Fri, 15 Oct 2010 08:08:09 +0000</pubDate> 
<guid>https://www.heckjj.com/hibernate2-find-and-iterate-vs-html/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 微软雅黑;">最近Heck被这个Session.find()的方法困扰了好几天，今天才看到新的Hibernate里没有了Session.find()方法。<br/>现在转载在此，方便大家。<br/><br/>查询性能往往是系统性能表现的一个重要方面，查询机制的优劣很大程度上决定了系统的整体性能。这个领域往往也存在最大的性能调整空间。 <br/><br/>hibernate2中Session.find()对应于3中的session.createQuery().list();<br/>hibernate2中Session.iterate()对应于3中的session.createQuery().iterate();<br/>find和iterate区别：<br/>find方法通过一条Select SQL实现了查询操作，而iterate方法要执行多条Select SQL.<br/>iterate第一次查询获取所有符合条件的记录的id，然后再根据各个id从库表中读取对应的记录，这是一个典型的N+1次的查询问题，如果符合条件记录有10000条，就需要执行10001条Select SQL，可想性能会如何的差。<br/><br/>那为什么要提供iterator方法，而不只是提供高效率的find方法？<br/><br/>原因1.与hibernate缓存机制密切相关<br/>find方法实际上是无法利用缓存的，它对缓存只写不读。<br/>find方法只执行一次SQL查询，它无法判断缓存中什么样的数据是符合条件的，也无法保证查询结果的完整性。而iterate方法，会首先查询所有符合条件记录的id，然后根据id去缓存中找，如果缓存中有该id，就返回，没有可以根据id再去数据库查询。<br/>String hql = &quot;from TUser where age &gt; ?&quot;;<br/>List userList = session.find(hql, new Integer(18), Hibernate.INTEGER);<br/>Iterator it = session.iterate(hql, new Integer(18), Hibernate.INTEGER);<br/>顺序执行，iterate方法只会执行一次SQL查询，就是查找id，然后根据id就可以从缓存中获得数据。</span><span style="font-family: 微软雅黑;"><br/><br/>String hql = &quot;from TUser where age &gt; ?&quot;;<br/>List userList = session.find(hql, new Integer(18), Hibernate.INTEGER);<br/>userList = session.find(hql, new Integer(18), Hibernate.INTEGER);<br/>缓存是不起作用的。<br/>如果目标数据读取相对较为频繁，通过iterate这种机制，会减少性能损耗。<br/><br/>原因2.内存使用上的考虑<br/>find方法将一次获得的所有记录并将其读入内存。如果数据量太大，可能会触发OutOfMemoryError，从而导致系统异常。解决方案之一就是结合iterate方法和evict方法逐条对记录进行处理，将内存消化保持在一个可以接受的范围之内。如：<br/>String hql = &quot;from TUser where age &gt; ?&quot;;<br/>Iterator it = session.iterate(hql, new Integer(18), Hibernate.INTEGER);<br/>while(it.hasNext()) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;TUser user = (TUser)it.next();<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;//将对象从一级缓存中删除<br/>&nbsp;&nbsp;&nbsp;&nbsp;session.evict(user);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;//二级缓存可以设定最大缓存量,达到后自动对较老数据进行废除,但也可以通过编<br/>&nbsp;&nbsp;&nbsp;&nbsp;//码移除,这样有助于保持数据有效性。<br/>&nbsp;&nbsp;&nbsp;&nbsp;sessionFactory.evict(TUser.class, user.getID());</span><br/>Tags - <a href="https://www.heckjj.com/tags/hibernate2/" rel="tag">hibernate2</a> , <a href="https://www.heckjj.com/tags/find/" rel="tag">find</a> , <a href="https://www.heckjj.com/tags/iterate/" rel="tag">iterate</a> , <a href="https://www.heckjj.com/tags/%25E6%2596%25B9%25E6%25B3%2595/" rel="tag">方法</a> , <a href="https://www.heckjj.com/tags/%25E5%258C%25BA%25E5%2588%25AB/" rel="tag">区别</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/hibernate2-find-and-iterate-vs-html/#blogcomment</link>
<title><![CDATA[[评论] hibernate2中find和iterate方法的区别]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://www.heckjj.com/hibernate2-find-and-iterate-vs-html/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>