Hibernate中Query.list()和Query.iterator()的區別

list每次都是通過一條語句直接操作數據庫取出所有的數據返回(並且將對象存入hibernate緩存);
iterator首先通過一條語句取出所有數據的id,然後通過id在hibernate的一級緩存中查找是否存在該對象,如果存在則直接取出,如果沒有則再次發出一條sql語句通過id取得對象(並且加入到緩存中),這樣如果所有的id在緩存中都沒有的話就會出現n+1條sql語句的問題。
這樣大家可能會想,同樣的查詢條件,第一次先list,第二次再iterate,就可以使用到緩存了。實際上這是很難的,因爲你無法判斷什麼時候是第一次,而且每次查詢的條件通常是不一樣的,假如數據庫裏面有100條記錄,id從1到100,第一次list的時候出了前50個id,第二次iterate的時候卻查詢到30至70號id,那麼30-50是從緩存裏面取的,51到70是從數據庫取的,共發送1+20條sql。所以我一直認爲iterate沒有什麼用,總是會有1+N的問題。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章