私のデスクトップ アプリケーションでは、新しいデータベースが頻繁に開かれます。Hibernate
/JPA
を ORM として使用します。問題は、 の作成EntityManagerFactory
が非常に遅く、高速なマシンで約 5 ~ 6 秒かかることです。重量が重いことになっていることは知っていEntityManagerFactory
ますが、これは、ユーザーが新しいデータベースをすばやく開くことを期待するデスクトップ アプリケーションには遅すぎます。
インスタンスをより速く取得するために、一部の EntityManagerFactory 機能をオフにすることはできますか? または、作成を高速化するために EntityManagerFactory の一部を遅延して作成することは可能ですか?
データベースの URL を知る前に、どうにかして EntityManagerFactory オブジェクトを作成できますか? これを可能にするために、すべての検証をオフにしていただければ幸いです。
そうすることで、後で使用するために EntityManagerFactory をプールできますか?
EntityManagerFactory をより速く作成する方法はありますか?
詳細情報と JProfiler プロファイリングによる更新
デスクトップ アプリケーションは、保存されたファイルを開くことができます。私たちのアプリケーション ドキュメント ファイル形式は、1 つの SQLite データベースと ZIP ファイル内のいくつかのバイナリ データで構成されています。ドキュメントを開くと、ZIP が抽出され、データベースが Hibernate で開かれます。データベースはすべて同じスキーマを持ちますが、データは明らかに異なります。
初めてファイルを開くときは、次の時間よりもかなり時間がかかるようです。JProfiler で 1 回目と 2 回目の実行をプロファイリングし、結果を比較しました。
1 回目の実行:
create EMF: 4385ms
build EMF: 3090ms
EJB3Configuration configure: 900ms
EJB3Configuration <clinit>: 380ms
.
2 回目の実行:
create EMF: 1275ms
build EMF: 970ms
EJB3Configuration configure: 305ms
EJB3Configuration <clinit>: not visible, probably 0ms
.
呼び出しツリーの比較では、いくつかのメソッドが大幅に高速であることがわかります (DatabaseManager. を出発点として):
create EMF: -3120ms
Hibernate create EMF: -3110ms
EJB3Configuration configure: -595ms
EJB3Configuration <clinit>: -380ms
build EMF: -2120ms
buildSessionFactory: -1945ms
secondPassCompile: -425ms
buildSettings: -346ms
SessionFactoryImpl.<init>: -1040ms
ホット スポットの比較で興味深い結果が得られました。
.
ClassLoader.loadClass: -1686ms
XMLSchemaFactory.newSchema: -184ms
ClassFile.<init>: -109ms
Hibernate クラスのロードなのか、Entity クラスのロードなのかわかりません。
最初の改善点は、必要なすべてのクラスを初期化するためだけにアプリケーションが開始されるとすぐに EMF を作成することです (アプリケーションに既に出荷されているプロトタイプとして空の db ファイルがあります)。@sharakan ご回答ありがとうございます。おそらく、 DeferredConnectionProvider はすでにこの問題の解決策になっているでしょう。
次に DeferredConnectionProvider を試してみます。しかし、それをさらに高速化できる可能性があります。他に提案はありますか?