3

約 3000 のエンティティ クラスを持つアプリケーションがあります。

多数のクラスがあるため、SessionFactory オブジェクトは約 150 MB のメモリを消費し、セットアップ (すべてのクラスの処理、プロキシの生成、およびメタ モデルの構築) にほぼ 1 分かかります。
プロセスのプロファイリングを行った後、時間の 1 分が で費やされorg.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory、半分が で費やされていることがわかりましたorg.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(EntityMetamodel, PersistentClass)。メモリ使用量とロード時間
を削減する方法を探しています。 1 つの考えは、クラス拡張をコンパイル時に移動することでしたが、それに関する情報はあまり見つかりませんでした。 エンティティの数は私が変更できないという事実ですが、誰かがデータベース アクセス (Hibernate 以外) を処理する方法についてより良いアイデアを持っている場合は、喜んでお知らせします。SessionFactory

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 に答える