我正在处理一个拥有数百个休眠实体和EAGER
关联的大型应用程序。当我启动此应用程序时,内存消耗非常高(超过1 GB)。
在启动之后查看应用程序的JVM堆转储,我分析并了解大部分内存被char[]
占用,并且来自应用程序的不同实体的SELECT
语句不同。 / p>
我认为这个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。
答案 0 :(得分:2)
确实存在很多与"查询计划缓存内存使用情况"相关的问题。 (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"
答案 1 :(得分:0)
“ hibernate.query.plan_cache_max_size”对我有用。通过尝试避免将动态参数发送到查询中的“ IN”条件,可以减少这种休眠查询缓存的实现。
SELECT * FROM TEST_TABLE WHERE A_COLUNN IN ($param1, $param2, ....)
对上面带有特定数量参数的示例查询生成的休眠查询的每次调用将在缓存计划中存储1行。尽可能使用发送给查询的固定数量的参数。