我最近意识到应用程序消耗的内存比它应该多。我做了一个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在应用程序启动时在内存中创建这些查询的目的是什么?
答案 0 :(得分:0)
您可以尝试添加此属性:
"hibernate.temp.use_jdbc_metadata_defaults","false"
并删除
"hibernate.hbm2ddl.auto", ""