区别:
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可以进行获取.