標籤:nbsp 資料 etc 情況 png 迴圈 create 9.png set
- 一級緩衝:緩衝實體
- 二級緩衝:緩衝實體
- Hibernate查詢快取緩衝的是查詢出來的實體的部分屬性結果集和實體的ID(注意這裡不是實體)。
- Hibernate查詢快取:對List起作用。但是Hibernate查詢快取對Iterator不起作用,只對List起作用。
Iterator不考慮緩衝,必會執行,且僅查詢出實體id的集合。
Iterator iter = session.createQuery("from GoUser").iterate();for(;iter.hasNext();){ GoUser u = (GoUser) iter.next(); System.out.println(u.getName());}
說明:Iterator這種方式會得到實體的id集合,查詢實體的具體屬性時會重新向資料庫發出請求。
如果開啟二級緩衝,迴圈遍曆時二級緩衝會將實體儲存。
關閉二級緩衝,開啟查詢快取的情況下
Session session = sf.openSession();session.beginTransaction();List<User> list = (List<User>) session.createQuery("from User") .setCacheable(true).list();for (User u : list) { System.out.println(u.getName());}session.getTransaction().commit();session.close();System.out.println("-----------------分割線------------------");Session session2 = sf.openSession();session2.beginTransaction();List<User> list2 = (List<User>) session2.createQuery("from User") .setCacheable(true).list();for (User u : list2) { System.out.println(u.getName());}session2.getTransaction().commit();session2.close();
執行結果:
說明:
關閉二級緩衝,開啟查詢快取的情況下,第一次list查詢,將所有實體的屬性資訊查詢出來,只執行了一條語句,然後僅儲存了實體id的列表,所以第二次查詢時,由查詢快取中的id去資料庫中取實體資料。
二級緩衝、查詢快取都開啟的情況下
代碼如上例
執行結果:
說明:
二級緩衝和查詢快取都開啟的情況下,由於查詢語句相同,則從查詢快取中尋找對應的id集合,然後根據id再從二級緩衝中尋找對應的實體,所以只執行一次資料庫操作。
Hibernate 二級緩衝疑痛點