91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Hibernate性能問題怎么解決

發布時間:2021-12-04 16:19:47 來源:億速云 閱讀:157 作者:iii 欄目:編程語言

本篇內容主要講解“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的查詢進行分開也是一種解決辦法。

到此,相信大家對“Hibernate性能問題怎么解決”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

舟曲县| 惠水县| 洛阳市| 勐海县| 驻马店市| 阿拉善盟| 万州区| 尼勒克县| 南郑县| 三江| 军事| 新巴尔虎右旗| 惠来县| 巴楚县| 隆林| 道真| 卢龙县| 清河县| 鹤庆县| 太仆寺旗| 海原县| 城固县| 菏泽市| 九江市| 张家界市| 安庆市| 普定县| 桂平市| 苏尼特左旗| 城市| 雷州市| 靖州| 建德市| 洪雅县| 山阴县| 白水县| 上饶县| 淳化县| 滦南县| 奈曼旗| 彭山县|