成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

概括潛在的Hibernate性能問題

開發 后端
這里介紹對于查詢結果比較多的情況無疑是一個Hibernate性能上的潛在威脅。碰到這樣的情況,將Many的查詢進行分開也是一種解決辦法。

學習Hibernate時,經常會遇到Hibernate性能問題,這里將介紹Hibernate性能問題的解決方法。

在使用Hibernate進行分頁的過程中,如果你收到如下警告,那么這里就是一個潛在的Hibernate性能問題點:

WARNING: firstResult/maxResults specified with collection fetch; applying in memory!

出現這個警告的直接后果是:無論你想要看第幾頁的數據,從Hibernate打印出的SQL來看它總是查詢了所有滿足條件的結果。這是為什么呢?來看看這句警告所在的代碼,它位于org.hibernate.hql.ast.QueryTranslatorImpl中,部分摘錄如下:

  1. view plaincopy to clipboardprint?  
  2. QueryNode query = ( QueryNode ) sqlAst;  
  3. boolean hasLimit = queryParameters.getRowSelection() != null && 
    queryParameters.getRowSelection().definesLimits();  
  4. boolean needsDistincting = ( query.getSelectClause().isDistinct() || hasLimit ) && 
    containsCollectionFetches();  
  5. QueryParameters queryParametersToUse;  
  6. if ( hasLimit && containsCollectionFetches() ) {  
  7. log.warn( "firstResult/maxResults specified with collection fetch; applying in memory!" )  
  8. RowSelection selection = new RowSelection();  
  9. selection.setFetchSize( queryParameters.getRowSelection().getFetchSize() );  
  10. selection.setTimeout( queryParameters.getRowSelection().getTimeout() );  
  11. queryParametersqueryParametersToUse = queryParameters.createCopyUsing( selection );  
  12. }  
  13. else {  
  14. queryParametersqueryParametersToUse = queryParameters;  
  15. }  
  16. List results = queryLoader.list( session, queryParametersToUse );  
  17. QueryNode query = ( QueryNode ) sqlAst;  
  18. boolean hasLimit = queryParameters.getRowSelection() != null && 
    queryParameters.getRowSelection().definesLimits();  
  19. boolean needsDistincting = ( query.getSelectClause().isDistinct() || hasLimit ) && 
    containsCollectionFetches();  
  20. QueryParameters queryParametersToUse;  
  21. if ( hasLimit && containsCollectionFetches() ) {  
  22. log.warn( "firstResult/maxResults specified with collection fetch; applying in memory!" );  
  23. RowSelection selection = new RowSelection();  
  24. selection.setFetchSize( queryParameters.getRowSelection().getFetchSize() );  
  25. selection.setTimeout( queryParameters.getRowSelection().getTimeout() );  
  26. queryParametersqueryParametersToUse = queryParameters.createCopyUsing( selection );  
  27. }  
  28. else {  
  29. queryParametersqueryParametersToUse = queryParameters;  
  30. }  
  31. List results = queryLoader.list( session, queryParametersToUse );  

關鍵在于if ( hasLimit && containsCollectionFetches() 這句判斷,如果滿足了這個條件,RowSelection將會被重新生成,原本分頁需要的firstRow和maxRows屬性將會丟失,后面的數據庫分頁自然也無法進行。Hibernate這么做的原因從代碼上也很容易理解,如果查詢需要限制條數(limit/offset)并且需要fetch結合對象,則重新生成RowSelection,進一步解釋,就是當一個實體(A)和另一個實體(B)是One-To-Many關系的時候,一個需要fetch的典型查詢語句是“select distinct a from A a left join fetch a.b”,由于1個A可能對應多個B,這個時候數據庫查詢的結果條數和需要生成的A對象的條數可能不一致,所以無法利用數據庫層的分頁來實現,因為你真正想分頁的是A而不是A left join B。出現這個警告就是提醒你這個查詢實際上是查詢了所有滿足條件的數據,Hibernate是在內存中對其進行了假分頁的處理。

這樣,對于查詢結果比較多的情況無疑是一個Hibernate性能上的潛在威脅。碰到這樣的情況,將Many的查詢進行分開也是一種解決辦法。

【編輯推薦】

  1. 分析Hibernate插入操作
  2. 剖析Hibernate批量更新
  3. 全面講解Hibernate二級緩存
  4. 講述Hibernate核心接口
  5. 概括Hibernate批量處理
責任編輯:佚名 來源: IT168
相關推薦

2009-09-21 16:56:14

Hibernateibatis

2009-09-28 15:24:38

Hibernate V

2009-09-28 17:27:27

Hibernate A

2009-09-24 09:25:10

Hibernate批量

2009-09-25 15:15:54

Hibernate檢索

2009-09-22 13:31:28

Hibernate C

2009-09-22 17:55:51

Spring Hibe

2009-09-29 16:29:40

Hibernate查詢

2009-09-22 13:12:25

Hibernateibatis

2009-09-22 09:31:15

Hibernate主鍵

2009-09-27 14:33:01

Hibernate批量

2009-09-28 09:56:53

Hibernate屬性

2009-09-22 09:40:03

cascade和invHibernate

2009-09-25 13:18:15

Hibernate數據

2009-09-23 18:05:48

2009-09-21 16:40:42

Hibernate可行

2009-09-22 14:52:55

Hibernate p

2009-09-23 13:21:32

Hibernate O

2009-09-25 10:22:35

Hibernate多表

2009-09-25 15:58:04

Hibernate對象
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩精品一区二区 | 国产精品久久久久久久久久三级 | 91久久看片| 91免费在线 | 日韩成人影院 | 国产精品免费在线 | 日韩在线一区二区三区 | 欧美日韩一区二区三区四区五区 | 97av在线 | 亚洲国产情侣 | 在线看片国产精品 | 国产一极毛片 | 国产永久免费 | 午夜精品久久久久久久久久久久久 | 亚洲成人播放器 | 国产成人午夜电影网 | 久久精品久久久 | 黄色一级大片在线免费看产 | 欧美理伦片在线播放 | 久久久久一区二区 | 久久久国产一区二区三区 | 午夜黄色 | 久久精品二区 | 亚洲精品福利视频 | 国产一级久久久久 | 日韩久久精品 | 国产精品一区二区三区99 | 91社区在线观看高清 | 欧美精品一区二区三区在线播放 | 亚洲国产成人av好男人在线观看 | 欧美va大片 | 日韩国产三区 | 久草在线免费资源 | 免费国产视频在线观看 | 99久久精品国产一区二区三区 | 日日夜夜精品视频 | 福利网站在线观看 | 国产亚洲一区二区三区 | 亚洲成人一区二区三区 | 天天弄天天操 | 337p日本欧洲亚洲大胆鲁鲁 |