簡體   English   中英

堆轉儲中有很多hibernate查詢。 我怎么限制?

[英]Lots of hibernate queries in heap dump. How can I limit?

我正在處理一個擁有數百個休眠實體和EAGER關聯的大型應用程序。 當我啟動此應用程序時,內存消耗非常高(超過1 GB)。

在啟動之后查看應用程序的JVM堆轉儲,我分析並了解到大部分內存都被char[]占用,其中包含來自應用程序不同實體的不同SELECT語句。

我想這個SELECT是由Hibernate的查詢計划緩存生成的。

我想限制開發環境的緩存大小。 我嘗試用一​​些屬性來限制大小:

"hibernate.query.plan_cache_max_size", "16" //default is 2048
"hibernate.query.plan_parameter_metadata_max_size", "16" //default is 128

但是內存消耗沒有差別。

我應該做些什么來限制Hibernate查詢的緩存?

我正在使用Hibernate 5.0.10。

實際上存在許多與“查詢計划緩存內存使用”相關的問題。 1234 )。 但是現在我們可以設置一些設置,其中之一是hibernate.query.plan_cache_max_size 這很奇怪,它沒有幫助,在我的情況下它起作用了。 也許這個問題隱藏在其他地方。

如果你有堆轉儲,嘗試使用Memory Analyzer(MAT)檢查你的假設,運行這個OQL查詢(如果你還沒有完成):

SELECT l.query.toString() FROM INSTANCEOF org.hibernate.engine.query.spi.QueryPlanCache$HQLQueryPlanKey l

它會為您提供更多信息。

以防萬一。 您是否嘗試更改所有這些設置的值?

"hibernate.cache.query_cache_factory"
"hibernate.query.plan_cache_max_size"
"hibernate.query.plan_cache_max_soft_references"
"hibernate.query.plan_cache_max_strong_references"
"hibernate.query.plan_parameter_metadata_max_size"

“hibernate.query.plan_cache_max_size”對我有用。 通過嘗試避免在查詢中發送到“IN”條件的動態參數,可以從實現中減少此hibernate查詢緩存。

SELECT * FROM TEST_TABLE WHERE A_COLUNN IN ($param1, $param2, ....)

對具有特定數量參數的上述示例查詢生成的hibernate查詢的每次調用都將在緩存計划中存儲1行。 如果可能,嘗試使用固定數量的參數發送到查詢。

暫無
暫無

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

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