區別:
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可以進行獲取.