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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM