2015-11-02 5 views
5

Hibernate newbie here。Hibernate - 最初のクエリは常により長くロードします

最初のレベルのキャッシュは、セッションが開いている場合にのみ利用可能です。セッションが閉じられると、第1レベルのすべてのキャッシュされたエンティティが追い出され/削除されます。これは正しいです?

私は、Hibernateフレームワークを使ってJavaで開発されたシンプルなCRUDアプリを持っています。私のアプリケーションが起動するたびに、最初のクエリ操作をロードして実行するたびに、実行時間は通常、後続のクエリ操作よりも長くなります。最初のクエリは通常、実行に17msかかり、成功するには1〜2msです。

私の質問は、これは本当にアプリケーションの開始時に休止状態の動作ですか?最初のクエリ操作から読み込まれたデータはどこかのキャッシュに保存されていますか? (間違いなく最初のクエリ操作を実行した後、セッションはすぐに終了するのでセッションキャッシュではありません)eager loadingがこの動作に影響しますか?

Hibernateのドキュメントではこれをカバーしていなかったので、どこから始めるべきか分かりません。私が間違っているなら、私を訂正してください。

私は本当にこれについて読んでどこから始めるべきかわからないので、私は助けていただきありがとうございます。

EDIT:詳細情報については、ここでは第一および第二のクエリ操作の休止統計だ:

まず:

100222 nanoseconds spent acquiring 1 JDBC connections; 
0 nanoseconds spent releasing 0 JDBC connections; 
23238430 nanoseconds spent preparing 3 JDBC statements; 
8333256 nanoseconds spent executing 3 JDBC statements; 
0 nanoseconds spent executing 0 JDBC batches; 
0 nanoseconds spent performing 0 L2C puts; 
0 nanoseconds spent performing 0 L2C hits; 
0 nanoseconds spent performing 0 L2C misses; 
40215588 nanoseconds spent executing 1 flushes (flushing a total of 3 entities and 3 collections); 
135213 nanoseconds spent executing 1 partial-flushes (flushing a total of 0 entities and 0 collections) 

第二:

168597 nanoseconds spent acquiring 1 JDBC connections; 
0 nanoseconds spent releasing 0 JDBC connections; 
2332976 nanoseconds spent preparing 3 JDBC statements; 
6427565 nanoseconds spent executing 3 JDBC statements; 
0 nanoseconds spent executing 0 JDBC batches; 
0 nanoseconds spent performing 0 L2C puts; 
0 nanoseconds spent performing 0 L2C hits; 
0 nanoseconds spent performing 0 L2C misses; 
1095389 nanoseconds spent executing 1 flushes (flushing a total of 3 entities and 3 collections); 
17600 nanoseconds spent executing 1 partial-flushes (flushing a total of 0 entities and 0 collections) 

同じクエリの実行ですが、異なるexecutiオンタイム長。

+1

おそらく、最初のクエリによって、永続性ユニットが初期化され、コンテナによって初期化されるデータソースと塗りつぶされる接続プールがトリガされる可能性があります。 – Gimby

+0

@ジンビーそれはすべて17ミリ秒よりもはるかに長くかかります。 –

+0

@DraganBozanovic私のローカルglassfish/payaraインストールに依存して、永続ユニットはすぐにセットアップされますが、最初に使用されたときに発生します。おそらく、サーバがオンデマンドで物理的に何を設定するのか、そうでないのかに依存します。私のポイントは、最初の使用初期化ヒットは珍しいことではないということです。 – Gimby

答えて

1

私の質問はこれです、これは本当にアプリケーションの 開始時にHibernateの挙動で?

あなたがたとえばWord文書を開くと、それはあなたがそれを閉じるときよりも、はるかに長い最初の時間がかかるし、それを再度開きます。したがって、これは実際にはHibernate固有の動作ではありません。

はキャッシュ どこかに保存された最初のクエリ操作からロードされたデータですか?

「どこでも」キャッシュされます。ディスクにはキャッシュレベルがあります。オペレーティングシステムは物事をキャッシュします。データベースは頻繁に/最近アクセスされたデータを確実にキャッシュします。プロセッサでさえ、独自のキャッシュを持っています。

しかし、それ以外にも、Javaの性質上、ウォームアップの時間があります。初めてクラスにアクセスすると、ディスクからロードされ、JITなどでコンパイルされます。

ここでは17msについて説明しています。上記のすべてを考慮すると、かなり良いウォームアップ時間です。

+0

これは、すべての休止状態のアプリケーションでは、すべての最初のクエリ操作が常に後続のクエリより長くかかることを意味します。したがって、ここでは休止状態のキャッシングは行われませんか? – Heisenberg

+1

これは、Hibernateのキャッシュには関係しません。 –

関連する問題