Query的list与iterate方法

当创建查询Query后,

 

首先不讨论它们利用缓存的时候:
如果调用它的 list方法,将一次性把所查询的所有满足查询条件的结果都将取出组合成list集合放入内存,因此只用一条sql语句。但如果符合查询条件的结果很大时则容易造成内存益处。

 

如果调用它的iterate方法,此时暂时也只执行一条sql语句,该sql语句用来查询出所有满足查询条件的结果的id,即唯一标识符,将它们组成一个集合,而不会查询出结果记录的其他字段值。而当我们实际开始迭代该结果集时,每迭代一次,就根据正迭代结果的标识符再产生一条sql语句从数据库中取出相应的数据。因此这样有多少个结果就会产生多少条sql语句,如果再加上最开始查询id的sql语句,则如果结果集为n,则产生的sql语句为n+1条。如果当结果集很大时也可能产生内存益处,因此我们可以迭代一个元素后立即将其从缓存中删除(包括两级缓存),这样我们就可以缓解一下结果集比较大的情况,当然如果查询出的id集合足够大也同样会造成内存益处。

 

然后再来考虑它们利用缓存的情况:
list只能利用一级缓存,不能利用二级缓存,因此如果一级缓存中已经存在符合查询条件的结果则不再从数据库中取。
iterate可以利用一级和二级缓存,因此如果它们中已经存在符合查询条件的结果则不再从数据库中取。

 

有时候我们需要混合使用它们两,当我们第一次取值或需要修改值时可以利用list,这样可以减少sql语句执行的条数,而其他情况则可以使用iterate,因为可以充分利用缓存。

你可能感兴趣的:(sql)