4

休止状態のクエリ キャッシュが実際にどのように機能するかを理解しようとしています。私が今見ているのは、新しいエンティティをデータベースに挿入するときに、Hibernate がその第 2 レベルのキャッシュを自動的に更新しないことです (ただし、Hibernate 呼び出しのみを使用しています)。私が見つけた唯一の方法は、新しいエンティティを挿入した後にキャッシュを手動で消去することでした。

より具体的な例を次に示します。多くのアイテムを持つことができる Container と呼ばれる永続的なエンティティがあります。すべてのアイテムをキャッシュしたかった:

@Cache(使用法 = CacheConcurrencyStrategy.READ_WRITE)
クラスアイテム
{
  // 残りのコード ...
}

クラスコンテナ{
  @Cache(使用法 = CacheConcurrencyStrategy.READ_WRITE)
public List getItems() { ... } // 残りのコード ... }

私が気付いた問題は、次の場合です。

1) いくつかのコンテナをデータベースからメモリに読み込みます (対応するアイテムと一緒に)

   String hql =
      "from Container c left join fetch c.items where c.type = 1";
   List<Item> list = hibernateTemplate.find(hql);

2) 選択したコンテナに新しいアイテムを挿入

   hibernateTemplate.save(item)

3) 最初の手順を繰り返して
から、3 番目の手順で、2 番目の手順で挿入した項目が表示されません。新しいアイテムを挿入した後にキャッシュを手動で消去した場合にのみ表示されます。

   sessionFactory.evictCollection("Container.items", updatedContainerId)

私の直感では、Hibernate はそのようなキャッシュの無効化を自動的に行うべきだと言っています。誰かがそれが働いているのを見たことがありますか? 私は何か間違ったことをしていますか、それともサポートされていないだけですか?

答えてくれてありがとう。こんにちはトム

4

3 に答える 3

6

クエリ キャッシュの仕組みに関する私のブログは、クエリ キャッシュの機能と、思ったように機能しない理由を理解するのに役立つかもしれません。

于 2009-07-10T07:19:18.713 に答える
1

Hibernateは、クエリ(またはクエリ名)と指定されたパラメータの値で構成されるキーを使用して、クエリからのデータを格納します。データを変更するときに無効にするキャッシュを簡単に知ることはできないと思います。

この問題を解決するには、SessionFactory.evictQueriesを呼び出すだけです。

于 2008-10-03T12:05:38.520 に答える
-1

はい、ネイティブ SQL クエリにはクエリ キャッシュの自動無効化がありません。HQL クエリの場合、クエリに参加するテーブルのいずれかにオブジェクトの INSERT/UPDATE/DELETE がある場合、すべてのキャッシュをクリアするだけです。

したがって、 Hibernate Dynamic SQL Cacheプロジェクトを試すことができます。これは、無効化せずに SQL クエリ キャッシュを自動的に更新することで、この問題を解決することを目的としています。

PS「トカゲのビル」理解してくれてありがとう:)

于 2012-06-04T16:44:51.700 に答える