我々のプロジェクトでは、hibernate4とehcacheを使用しています。私たちはほとんど不変オブジェクトを扱うので、キャッシングはアプリケーションにうまく収まる機能です。Hibernate cache:キャッシュされたクエリによって返されたオブジェクトがL2キャッシュに格納されていますか?
@Entity
@Table(name = "DOGS")
@Immutable
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
class Dog {
@Id @Column
Long id;
@Column
String name;
}
とクエリ:
Criteria criteria = session.createCriteria(Dog.class);
criteria.add(Restrictions.in("id", ids));
criteria.setCacheable(true);
クエリキャッシュの生存時間に設定され、我々は、以下のエンティティを持っていると仮定すると
:クエリキャッシュを有効にしようとしているが、我々は次のような問題に遭遇しました犬のtimeToLiveの約3/4。それが実行され、返された犬のインスタンスは、セカンドレベルに格納されている、
- クエリが初めて呼び出されたとき(ある空のキャッシュを想定):ここでは(私は間違った仮定をしたなら、私を修正してください)シナリオですキャッシュ。また、Dog IDはクエリキャッシュに格納されます。
- クエリが2回呼び出されたとき(犬IDがクエリキャッシュにあり、犬オブジェクトがL2キャッシュにある)、すべて正常に機能します。クエリキャッシュはIDを返し、DogはL2からフェッチされます。
- クエリキャッシュの有効期限が切れても(ただしL2キャッシュは有効です)、クエリが再実行され、Dog IDがキャッシュされます。
- ここで、L2キャッシュはDogオブジェクトで期限切れになり、すべてのオブジェクトがキャッシュから追い出されます。クエリキャッシュにはまだidsがキャッシュされているため、hibernateはDogオブジェクトを1つずつフェッチします。これは永久にかかります。
第3のポイントは私を悩ませています。クエリキャッシュが無効化され、データベース上で再実行され、Dogオブジェクトがフェッチされましたが、DogオブジェクトはL2キャッシュで更新されませんでした。クエリはクエリキャッシュ内のdog IDのみを更新し、L2キャッシュは更新しなかったようです。
L2キャッシュにもクエリを強制的に更新する方法はありますか?おそらく、このシナリオは異なる方法で処理されるでしょうか?
「もL2キャッシュを更新するクエリを強制的に」これはあなたの質問に対する解決策だと思いますEHCacheが更新の際にそれを処理するように、キャッシュ・モードを書込みます。 – Phani
エンティティは読み取り専用なので、役立たないでしょう。 –