query 的list()和iterator()区别


区别:

  1.返回的类型不一样,list返回List,iterate返回iterator.

  2.查询策略不同。(获取数据的方式不一样,list会直接查询数据库,iterate会先到数据库中获取id,然后真正遍历某个对象引用的时候,先到缓存中找,如果找不到,以id为条件再发一条sql到数据库,这样如果缓存中没有数据,则查询数据库的次数为n+1).

  3.list中返回的list中每个对象都是其本身的对象,iterate中返回的对象是代理对象.

  4.list只能put不能获取,iterate可以进行获取.


以下几种情况可进行诠释:


(一级缓存)同一个事务情况下:



实现效果图:


list存入数据,二次获取的时候没有走二级缓存,直接走数据库,sql相同。

iteratorsql生成明显不同,查询策略不同。

list: 结果存入缓存,但不从缓存里面取;查询时属性连同id一起找出来,只有"select语句"; iterate:结果存入缓存,可在缓存中查找结果;查询时先找出所有的 id,然后根据 id 到缓存里面查找,如果没有命中,再到数据库中查找该id对应的其他属性。可能会有多行 select。


(二级缓存)多个事务进行获取模式下:list能否获取?



测试结果:


结论:显然是第二种结论判断,不可获取缓存。


(二级缓存)iterator进行获取:

测试数据:


结论:


iterator进行了获取缓存,sql只查询了对应的编号,进行了数据的获取。


总结:list只能put不能get,iterate可以进行获取.

原文地址:https://www.cnblogs.com/hq-123/p/5842492.html