[英]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。
實際上存在許多與“查詢計划緩存內存使用”相關的問題。 ( 1 , 2 , 3 , 4 )。 但是現在我們可以設置一些設置,其中之一是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.