hibernate查詢方法選擇(List()與Iterator())二者的區別?

導讀:
   hibernate方法選擇
  a) 完成一樣一件事,HIBERNATE提供了可供選擇的一些方式,但具體使用什麼方式,可能用性能/代碼都會有影響。顯示,一次返回十萬條記錄(List /Set/Bag/Map等)進行處理,極可能致使內存不夠的問題,而若是用基於遊標(ScrollableResults)或Iterator的結果 集,則不存在這樣的問題。
  b) Session的load/get方法,前者會使用二級緩存,然後者則不使用。
  c) Query和list/iterator,若是去仔細研究一下它們,你可能會發現不少有意思的狀況,兩者主要區別(若是使用了Spring,在HibernateTemplate中對應find,iterator方法):
  i. list只能利用查詢緩存(但在交易系統中查詢緩存做用不大),沒法利用二級緩存中的單個實體,但list查出的對象會寫入二級緩存,但它通常只生成較少的執行SQL語句,不少狀況就是一條(無關聯)。
   ii. iterator則能夠利用二級緩存,對於一條查詢語句,它會先從數據庫中找出全部符合條件的記錄的ID,再經過ID去緩存找,對於緩存中沒有的記錄,再 構造語句從數據庫中查出,所以很容易知道,若是緩存中沒有任何符合條件的記錄,使用iterator會產生N+1條SQL語句(N爲符合條件的記錄數)
  iii. 經過iterator,配合緩存管理API,在海量數據查詢中能夠很好的解決內存問題,如:
  while(it.hasNext()){
  YouObject object = (YouObject)it.next();
  session.evict(youObject);
  sessionFactory.evice(YouObject.class, youObject.getId());
  }
  若是用list方法,極可能就出OutofMemory錯誤了
  iv. 經過上面的說明,我想你應該知道如何去使用這兩個方法了。
  
   ps:List 僅僅會填充二級緩存,卻不能利用二級緩存,而iterator能夠讀二級緩存,然而沒法命中的話,效率卻很低。一個最好的辦法就是,第一次查詢使用 List,隨後的查詢使用iterator,如今的問題是如何作到第一次查詢使用List,隨後查詢使用iterator。   先來考察一下緩 存的做用:緩存之因此能夠命中,前提條件是該數據被使用的很是頻繁,同時更新的可能性至關小,若是數據會頻繁修改,那麼毫無疑問,緩存不會帶來任何好處。 明確了這一點,咱們就明白什麼對象應該進行緩存了。顯然,對於那些常常會被訪問到的小批量的諸如基礎信息,用戶和權限信息是很是適合進行緩存的,這些數據 咱們能夠在應用啓動的時候就執行一次list方法查詢,進行緩存填充(例如寫一個InitBean類進行數據緩存初始化),此外在數據被修改的時候,再次 執行list方法,進行緩存填充。而在使用這些數據的其餘地方,通通使用iterator方法。這樣就能夠實現所謂的第一次查詢使用List,隨後的查詢 使用iterator了。
相關文章
相關標籤/搜索