| « | November 2025 | » | | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | | | | | | |
| 公告 |
| 暂无公告... |
| Blog信息 |
|
blog名称: 日志总数:15 评论数量:30 留言数量:0 访问次数:94716 建立时间:2006年4月26日 |

| |
|
Hibernate:Query.list 与 Query.iterate 的区别 读书笔记
NaddyLee 发表于 2008/1/25 17:03:19 |
| list: 结果存入缓存,但不从缓存里面取;查询时属性连同id一起找出来,只有“一句”select; iterate:结果存入缓存,并在缓存中查找结果;查询时先找出所有的 id,然后根据 id 到缓存里面查找,如果没有命中,再到数据库中查找该id对应的其他属性。可能会有多行 select。
分页:firstResult 与 maxResult 的影响。Oracle:支持 rownum <= ? 的写法,因此在返回的结果集大小上对 list 和 iterate 都是一样的。但 maxResult 比较大时对使用 list 较为有利(不考虑缓存),因为 iterate 是要按 id 进行多次查找的。 对于不支持部分结果集的数据库,必须返回所有结果(?)。这个时候,list 可能会消耗大量的内存并导致效率降低。iterate 因为只是 返回所有id,相对较好。 不过如果是大数据量的应用,应该还是要用支持部分结果集的数据库。
如果使用二级缓存且缓存命中率较高(数据经常使用,并且较少更新),此时可以使用 iterate。
一个简单的测试结果:
查询某对象,共1000个记录,测试 5 次,每次分别取 10、20、50个结果,平均访问时间如下(ms)。数据库Oracle,无二级缓存
Query.list
10
20
50
1
89
94
266
2
143
92
255
3
106
106
106
4
293
150
104
5
151
167
104
Query.iterate
10
20
50
1
273
390
403
2
120
311
407
3
270
399
253
4
196
306
250
5
275
153
257 |
|
|