2012-10-03 54 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

儘管如此,這並不能解決你的內存問題,因爲這些代理的對象仍將在運行時創建 –