JPA / Hibernate在应用程序启动时在内存中维护了大量查询

时间:2016-04-08 19:14:29

标签: java hibernate jpa jboss

我最近意识到应用程序消耗的内存比它应该多。我做了一个JVM的线程转储,发现在Hibernate SessionFactoryImpl中有数百兆字节的SQL查询。

这些查询出现在内存中,只是启动应用程序服务器。我已经放弃了队列(JMS)的假设或后台的其他一些过程。

查询采用以下两种格式:

select
diferenc0_.id as id975_137_,
[...]
where diferenc0_.id=?

或者

select
diferenc0_.id as id975_137_,
[...]
where diferenc0_.id= IN (?,?,?,?,?,?,?,?) -- because default_batch_fetch_size = 8

我的persistence.xml配置(我关闭了hbm2ddl):

"hibernate.hbm2ddl.auto", ""
"hibernate.query.startup_check", "false"
"hibernate.show_sql", "false"
"hibernate.format_sql", "false"
"hibernate.transaction.auto_close_session", "true"
"hibernate.cache.use_second_level_cache", "false"
"hibernate.cache.use_query_cache", "false"
"hibernate.jdbc.batch_size", "20"
"hibernate.default_batch_fetch_size", "8"

我正在使用Hibernate 3.3.0。

另一个重要细节:这些查询不会发送到数据库!我和我们团队的DBA分析了Jboss启动时发送到数据库的查询。我们还在系统中不使用命名查询

由于应用程序有点旧,旧的开发人员在映射中使用了获取EAGER资源。所以这些生成的查询真的很大。

问题:Hibernate在应用程序启动时在内存中创建这些查询的目的是什么?

1 个答案:

答案 0 :(得分:0)

您可以尝试添加此属性:

"hibernate.temp.use_jdbc_metadata_defaults","false"

并删除

"hibernate.hbm2ddl.auto", ""