12

私は、約 2100 のテーブルを持つデータベース モデルを持つ大規模な ERP プロジェクトに取り組んでいます。Hibernate でマップされた「わずか」500 個のテーブルでは、Web サーバーにデプロイされたアプリケーションは約 3GB の作業メモリを必要とします。

1 つの永続化ユニットで多くのテーブルを使用する場合、Hibernate のメタモデルのメモリ フットプリントを削減する方法はありますか? それとも、ORM をあきらめて、単純な古い JDBC (またはjOOQ ) を使用する必要がありますか?

現在、Hibernate 4.1.8、Spring 3.1.3、JBoss AS 7.1 を使用しており、MSSQL データベースで作業しています。

編集:

JavaMelody メモリ ヒストグラム出力- 2000 個のテスト テーブルが生成され、元の db モデルよりもスコープが少し小さくなっています (したがって、消費メモリは 1.3GB のみです)。

編集2:

Java MAT ヒープ分析:

4

4 に答える 4

5

開いている休止状態のセッションは、使用中にオブジェクトを蓄積する傾向があります。これはメモリ リークではありません。休止状態のセッションは、リクエストに対して 1 回だけ使用されるように設計されており、クエリやその他のデータだけでなく、永続的な (つまり、セッション内に存在する) オブジェクトもキャッシュします。を呼び出すとsession.toString()、セッションに存在するオブジェクトのランドリー リストが表示されます。

非常に多数のオブジェクトを扱う場合は、オブジェクトをバッチで処理することを検討してください。各バッチの後に呼び出しsession.clear()て、キャッシュされたデータと永続オブジェクトをセッションから削除し、セッションのメモリ フットプリントを (場合によっては劇的に) 削減できます。

を呼び出した後、この呼び出しの前にロードされたオブジェクトは切り離されsession.clear()た状態に戻り、現在のセッションではアクティブでなくなることに注意してください。

遅延フェッチを使用して、特定の操作を処理するために hibernate がロードする必要があるデータの量を最適化することもできます。詳細については、休止状態のドキュメントを参照してください。休止状態の SQL ロギング機能を有効にし、休止状態が必要のないデータを引き戻しているかどうかを確認することをお勧めします。

また、休止状態を構成して、以下に役立つ統計を収集することもできます。

sessionFactory.getStatistics().setStatisticsEnabled(true);
于 2012-12-06T01:53:51.817 に答える
1

hibernate オブジェクトの目的は何ですか。hibernate は CURD (作成、更新、読み取り、削除) にのみ適していますが、計算には適していません。あらゆる計算目的 (特にクロス テーブル) では、ストア プロシージャと ibatis を一緒に使用することをお勧めします。

于 2012-12-06T05:24:33.933 に答える