2012-10-03 71 views
3

我有大约3000个实体类的应用程序。如何减少Hibernate的SessionFactory内存使用和加载时间

由于大量的类的SessionFactory对象消耗大约150 MB的存储器,并采取几乎一分钟,以设置(处理所有等级,生成代理和构建所述元模型)。
剖析我发现的一分钟时间都花在org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory而一半在org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(EntityMetamodel, PersistentClass)的过程之后。
我正在寻找方法来减少SessionFactory内存使用情况和加载时间。
一个想法是将课程改进移到编译时间,但我没有找到关于它的很多信息。
实体的数量是一个事实,我无法改变,但如果有人对如何处理自己的数据库访问(比休眠等)更好的想法,我会很高兴听到这个消息。

+0

你使用属性中最懒的关系? – esmoreno

+0

大约需要多长时间? –

+0

阅读本文http://stackoverflow.com/questions/23867296/postinstantiate-buildsessionfactory-slow-memory-huge-database –

回答

1

首先看看SessionFactory内发生了什么。 Hibernate提供JMX连接器,请参见documentation here。然后,您可以开始查看您的热点以及如何重构它们。你真的需要开始收集更多的指标。现在可能是什么,包括GC问题。

2

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

+0

我的意思是代理代,我认为这可以在构建时完成(org.hibernate.tool.instrument .javassist.InstrumentTask) –

+0

尽管如此,这并不能解决你的内存问题,因为这些代理的对象仍将在运行时创建 –