0

私はEhcacheでHibernateを使用しています(重要ではないと思います)。ユーザーがログインすると、私は彼の電子メールで彼を識別し、その後のすべての呼び出しに彼の電子メールを使用します。さて、電子メールは私の「休止状態のID」(私@Idが注釈を付けたもの)ではないので、クエリをロードして、クエリキャッシュに保存する必要があります。ただし、ユーザーがログアウトすると、それ以降にログインしている他のユーザーと共有する領域内に保存されているため、キャッシュから明示的に削除することはできません。

私の質問は次のとおりです。メソッドを使用してデータベースに再度アクセスすることなく、ユーザーを2次キャッシュにロードできますか(したがって、エビクションが容易になります)session().get(user)?ここに別のポイントがあります。ユーザーが更新されると、このユーザーのクエリキャッシュが正しくなくなります。ユーザーを更新するときに更新したい

4

3 に答える 3

0

あなたはそれを必要以上に難しくしています。クエリキャッシュを使用して、同じ引数でクエリを実行するたびにデータベースにアクセスしないようにします。ユーザーがログアウトすると、これらの特定の引数を使用したクエリはその後あまり実行されず、キャッシュは最終的に、その排除ポリシー(LRU、タイムアウトなど)に基づいてこの特定のクエリをキャッシュから排除します。キャッシュは透過的である必要があり、何も削除する必要はありません。

ユーザーの電子メールアドレスを使用する代わりにIDを使用してユーザーを参照する場合は、このユースケースのクエリキャッシュを完全に回避できます。IDはそのために使用されます。エンティティを一意に参照し、session.getおよびsession.loadを使用してユーザーをロードできます。ログインに電子メールを使用することは問題ありません。ログイン後、アプリケーションはユーザーの電子メールではなく、ユーザーを参照するためにユーザーのIDを使用する必要があります。

最後の点について:ユーザーを更新すると、Hibernateはキャッシュの結果を自動的に無効にします。そして、そうでなかったとしても、クエリキャッシュは返されたエンティティのIDのみを保存します。エンティティの状態はエンティティキャッシュからロードされ、エンティティが更新されると無効(または更新)になります。

于 2011-10-30T11:08:39.203 に答える
0
  1. なぜユーザーをキャッシュから削除したいのですか?キャッシュを適切に構成すると、しばらくするとキャッシュが使用されなくなるとキャッシュから削除されます。

  2. 休止状態を介してユーザーを更新する場合、第2レベルのキャッシュはそれを確認して処理する必要があります。

Hibernateでのキャッシングについて読みたいように思えます:http ://www.javalobby.org/java/forums/t48846.html

于 2011-10-30T11:05:32.317 に答える
0

最初の質問:ユーザーがログアウトしたときに、なぜユーザーをクエリキャッシュから削除したいのですか?なぜあなたのアーキテクチャがそれを必要とするのか想像できません。キャッシングは透過的である必要があり、EhCacheは、不要になった場合やキャッシュに収まらない場合に、ユーザーを簡単に削除できます。

ユーザーが更新されると、Querycacheはこのユーザーに対して間違ったものになります

いいえ、少なくとも更新がHibernateを介して行われる場合は、そうではありません。クエリキャッシュがどのように機能するか知っていますか?あなたの場合、それは電子メール->ユーザーIDマッピングを保存します。電子メールでクエリを実行する場合、Hibernateは最初にこの電子メールに関連付けられているユーザーIDを検索し、次にIDでユーザーを検索します。2次キャッシュに存在する場合は、そこからロードされます。それ以外の場合、HibernateはユーザーをIDで透過的にロードします。ただし、電子メールでクエリを実行するよりも優れています。

そうは言っても、ユーザーを更新すると、HibernateはL2キャッシュを自動的に更新/削除し、ユーザーが関与するすべてのクエリのクエリキャッシュを更新します。それはうまくいきます。

ユーザーを更新するときに更新したい

どう言う意味ですか?発生する唯一の古いデータは、L1キャッシュに保存されているユーザーインスタンスであり、L2とクエリキャッシュはシームレスに更新されます。

参照:Hibernate + Springを使用したキャッシング-いくつかの質問!

于 2011-10-30T11:05:57.290 に答える