3

我有一个包含大约 3000 个实体类的应用程序。

由于类的数量众多,SessionFactory 对象消耗大约 150 MB 的内存并且需要将近一分钟的时间来设置(处理所有类、生成代理和构建元模型)。
在分析了这个过程之后,我发现一分钟的时间花在了,org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory而一半的时间在org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(EntityMetamodel, PersistentClass).
我正在寻找减少SessionFactory内存使用和加载时间的方法。
一种想法是将类增强移动到编译时间,但我没有找到太多关于它的信息。
实体的数量是我无法改变的事实,但是如果有人对如何处理他们的数据库访问(除了 Hibernate)有更好的想法,我会很高兴听到它。

4

2 回答 2

2

3000节课对我来说听起来太疯狂了。
“类增强”是什么意思?
我认为你应该仔细重新考虑你的应用程序的设计。
Hibernate 大量使用 Proxy 对象(例如,当您运行 setter 时,Proxy “聚合”此更改,因此 Hibernate 可以生成仅包含更改字段的更新 SQL)。Hibernate 还使用代理使用的内存中的类信息(如上所述),这就是为什么你的内存会像这样增长

于 2012-10-03T14:44:10.627 回答
1

首先查看 SessionFactory 内部发生的情况。Hibernate 提供了一个 JMX 连接器,请参阅此处的文档。然后你可以开始研究你的热点以及如何重构它们。您确实需要从收集更多指标开始。现在它可能是任何事情,包括 GC 问题。

于 2012-10-03T14:45:11.170 回答