簡體   English   中英

Hibernate-SQL很快,但是查詢仍然很慢

[英]Hibernate - SQL is fast, but query is still slow

我正在使用Javassist運行時工具在Oracle 12c之上的Hikari池上運行Hibernate 4.1。 JDK是1.7。

我有一個查詢,該查詢在數據庫上運行非常快,並在Hibernate中獲取約500個實體。 根據JProfiler,查詢運行時很小,大約11毫秒,但Query.list總共運行大約7秒鍾。

我嘗試刪除所有過濾器,結果表明大部分時間都花在Javaassist和其他與Hibernate相關的反射調用(如AbstractProxyHandler等)上。 我讀到反射開銷應該很小,但似乎不是,似乎太多。

您能告訴我這里的瓶頸是什么嗎?

確保您要檢索的對象沒有作為SELECT而不是作為JOIN急切地延遲獲取的子對象。 這可能導致稱為SELECT N + 1的行為,在該行為中,Hibernate最后運行查詢以從其各自的表中獲取500個對象,然后對每個對象進行附加查詢以獲取子對象。 如果有4個或5個關系作為每個記錄的SELECT語句獲取,並且有500條記錄,則突然要運行2000個查詢才能獲取列表。

我建議為Hibernate打開SQL日志記錄,以查看它正在運行哪些查詢。 如果在獲取列表時轉儲了很長的SELECT查詢列表,請查看映射文件以了解如何建立關系。 嘗試將它們調整為fetch =“ join”,看看這些查詢是否消失了,性能是否得到了改善。

以下是一些可能相關的堆棧溢出問題,這些問題可能能夠提供更具體的細節。

休眠FetchMode SELECT vs JOIN

什么是N + 1 SELECT查詢問題?

關於探查器和其他此類工具的其他注意事項。 通常,在跟蹤性能問題時,特定的代碼塊將顯示為花費最多的時間。 人們傾向於跳轉到一個普遍的結論,即所討論的代碼塊很慢。 在您的情況下,您似乎正在觀察Hibernate的反射代碼,因為它是花費時間的地方。 非常重要的一點是,考慮到此代碼本身實際上可能不會很慢,但是由於算法復雜性 而經常調用它,因此它是花費時間的地方。 我發現許多問題,當現實是使用代碼與外部資源進行通信時,序列化或反射似乎很慢,並且該資源被調用了數千次,而只能被稱為少數。 進行數千次查詢以獲取您的列表將導致您的采樣顯示,在處理這些查詢的代碼中花費了大量時間。 注意不要將由於設計/配置問題而經常調用的代碼誤認為是緩慢的代碼。 問題很可能不在於休眠對反射的使用,因為反射通常不會在幾秒鍾的時間內變慢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM