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的問題。
Hibernate中Query.list()和Query.iterator()的區別
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
Android緩存機制分析
添码星空
2020-06-22 23:46:58
MyBatis——緩存機制
little_fat_sheep
2020-06-21 19:21:07
使用 Redis 做 MyBatis 二級緩存
allen_jinjie
2020-06-21 09:16:49
MyBatis(21)- mybatis 二級緩存
一角残叶
2020-06-16 02:07:07
Hibernate的一級緩存、二級緩存和查詢緩存
亦阿克温
2020-06-06 12:32:34
HIbernate 5.3 (十)
venus321
2020-05-31 19:38:36
爲什麼CPU緩存會分爲一級緩存L1、L2、L3?有什麼意義?
china_zyb
2020-05-25 15:49:49
MyBatis複習(六):MyBatis二級緩存
CD4356
2020-05-23 23:17:15
springboot中mybatis整合redis做二級緩存
liangshui999
2020-04-27 23:47:03
詳解:mybatis一級緩存二級緩存以及相關實現
puyuma
2020-04-19 14:43:39
springboot cache 緩存管理
韩惠德
2020-04-13 17:54:42
細說mybatis一級緩存二級緩存
理木客
2020-03-15 15:56:03
一家反欺詐公司的面試經歷——7.hibernate的二級緩存問題
学习Java的小姐姐
2020-03-07 23:45:37
Hibernate 一級緩存和二級緩存
liangbinny
2020-02-25 16:14:38