Hibernateのクエリキャッシュ-オブジェクトは2級レベルのキャッシュ-リスク?便利なのでしょう?悪い習?
-
22-09-2019 - |
質問
に関する 質問
を前提と:
これが私の仮定に基づき、読み、理解し、彼らが誤っている可能性が考えられれば、下のコメントそもそもの私の回答の編集の問題をもたらしていました。
- クエリキャッシュが中心と2級レベルのキャッシュ
- クエリキャッシュキャッシュの識別結果のクエリー+パラメータ
- クエリキャッシュが危険な場合、データベースに変わったんで反映されるキャッシュ
質問
しているオブジェクトは2級レベルます。により一部の悪いプログラミングやその他の制約で、コードを読み込みオブジェクトが呼び出されている複数の時間と同じhibernateのセッション。のretrivalはHQL索クエリ 例えば
hibernateTemplate.find("from Foo f where f.bar > ?", bar);
追加する前にクエリキャッシュの場合、上記のコードと呼ばれたN倍内にはHibernateのセッションがNのヒットのデータベース
そして見たかったした場合はどうなクエリキャッシュ:
Query query = session.createQuery("from Foo f where f.bar > ?");
query.setCacheable(true);
query.setParameter(bar);
query.list();
加えてみるとクエリキャッシュを使って同じセッションでは、hibernateなヒットのデータベースのN倍にも、一度だけます。
- 私の最初の仮説は、Hibernateの最初の検索でセッションのキャッシュ、そして第2レベルします。この仮定は正しいのですか。
- も想定した場合には、オブジェクト(
Foo
は、第2レベルのキャッシュに変更したデータベースに、そのクエリキャッシュ、クロスセッションscoped、間違った識別子は、このように間違ったオブジェクト。A:はい、そうなります。 - がそのものを用いたクエリキャッシュのためのクエリーなどの変更不能な情報にも非2Lキャッシュされた物にするのではなく、すでに多くの実践?(例:クエリのそのwhere節されることを条件も同様の結果、例えば"選択p.ser_num p.id=?"といser_num、idカップルが変わらない一度作成した)
ちなみに、関連する 質問 このクエリキャッシュな作品のセッションのキャッシュです。私missunderstandingということなど、何でも結構ですので、?
解決
クエリキャッシュは、特定のタイプの2番目のレベルキャッシュです。あなたが第2レベルのキャッシュと呼ぶものは、「オブジェクトキャッシュ」を呼び出したいと思います。
あなたの仮定に対するコメント:
- クエリキャッシュは、主に2番目のレベルのキャッシュ(別名オブジェクトキャッシュ)とともに優れています。
クエリキャッシュは、クエリの生の結果を主要なキーとしてのみ保持します。実際の水分補給オブジェクトは保持されません。これは、JDBCでクエリを実行するとき、実際には結果セットを繰り返すときに水分補給(埋め立て)オブジェクトを実際に与えるだけです。声明は必ずしも正しいとは限りません。クエリが非常に複雑で、したがって実行に非常に長い時間がかかる場合、クエリキャッシュを使用してその時間を節約できます。クエリキャッシュを使用して、データベースからオブジェクトをロードするのにかかる時間を節約することはできません。
- データベースが変更された場合、クエリキャッシュは危険であり、キャッシュに反映されていません
これは事実ですが、クエリキャッシュに固有のものではありません。同じことは、2番目のレベルのキャッシュと呼ばれるものにも当てはまりますが、通常はオブジェクトキャッシュと呼ばれます。
したがって、私の最初の仮定は、Hibernateがセッションキャッシュで最初に検索し、次に2レベルのキャッシュで検索することです。この仮定は正しいですか?
はい、オブジェクトにロードするとき、これは動作です。
また、2番目のレベルのキャッシュにないオブジェクト(FOO)がデータベースで変更された場合、クロスセッションスコープでクエリキャッシュが間違った識別子、したがって間違ったオブジェクトを返すと仮定します。あれは正しいですか?
はい、オブジェクトキャッシュとクエリキャッシュの両方が影響を受けます。これは、冬眠を介してデータベースが変更された場合にのみ懸念事項です。クエリキャッシュのタイムアウトを設定することにより、この効果を緩和できます。
2Lのキャッシュされていないオブジェクトでも不変の情報を含むクエリにクエリキャッシュを使用することは、良い習慣ですか? (例えば、句には常に同じ結果を返す条件が含まれている場合、例えば「p.ser_numを選択します。ここでp.ser_num =?」
これらの種類のオブジェクトの場合、オブジェクトキャッシュとクエリキャッシュの両方を使用しない理由はありません。
そして、はい、クエリキャッシュはセッションレベル別名レベル1キャッシュでは機能しません。したがって、クエリを再度実行すると、データベースに再びヒットする理由があります。クエリの結果(IDセット)をセッションキャッシュに入れません。
他のヒント
のみを仮定:
このよう 第 から、Hibernateのドキュメンテーション
[クエリキャッシュ]を新たにキャッシュ 地域:有キャッシュされたクエリ 結果セット オーガニックシンセシス(org.hibernate.ます。StandardQueryCache), その他の保持タイムスタンプの 最近の更新queryable テーブル オーガニックシンセシス(org.hibernate.ます。UpdateTimestampsCache).
っているものと推察されるときにタイムスタンプのqueryableテーブル最新情報をメールにてお届けし、結果セットの影響を与えてしまうことにもなり、hibernateのDBを次に呼び出されるクエリー、およびこのクエリキャッシュ安全であります。
が2つの文章の後同項の規定に文書で言うのです:
クエリのキャッシュを使用する際には、必ず 併せて第二次レベルの ます。
再び、私の想定ではこの冬眠できる意識データベースへの変更はこの特定のユーザのセッション
あなたの質問#3については、オブジェクトがキャッシュされていないときにクエリキャッシュを使用したくないと思います。すべてのプライマリIDになりますが、キャッシュなしでクエリを実行するよりも遅いオブジェクトを取得するには、キーごとにデータベースを1回押す必要があります。とにかく3.3の時点で、おそらく新しいバージョンでは、より少ないクエリを使用して欠落しているオブジェクトをつかみます。たとえば、(:id1、:id2、...)。