私はこの問題で数日間壁に頭をぶつけてきました。
Infinispanを使用して、Hibernateの第2レベルのキャッシュを実装しようとしています。アプリケーションはJBossAS6で実行されており、JTAトランザクションを使用しています。
私たちのpersistence.xmlには次のものがあります:
...
<!-- JTA configurations -->
<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" />
<property name="current_session_context_class" value="jta" />
<!-- Infinispan configurations -->
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.use_query_cache" value="true" />
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.infinispan.InfinispanRegionFactory"/>
<property name="hibernate.cache.infinispan.cachemanager" value="java:CacheManager/entity"/>
...
ここで定義されているように:
私たちの理解では、これは次のことを行うために必要な種類のキャッシュです。
ユースケース1: 参照データを保持するデータベースにレコードがあります。このデータは長期間変更されません(私たちは願っています:))。
これらのレコードは多くのクエリが実行される可能性があるため、キャッシュしたいと思います。また、ユーザーがこのデータをクエリするときに、キャッシュする必要があるため、DBに移動する必要はありません。
この場合、キャッシュタイプはクエリキャッシュですか、それともエンティティキャッシュですか?クエリは常に同じであるため、queクエリは常に同じ結果を返すことになっているため、クエリキャッシュであると理解しています。
私の質問:
List<MyEntity> list = session.createCriteria(MyEntity.class)
.add(Restrictions.eq("id", 1))
.setCacheable(true)
.list();
ユースケース2: ユーザーがDBから特定のレコードを取得し、それを更新する場合があります。このエンティティ(またはエンティティのリスト)をユーザーのセッション(ログインセッション)キャッシュに保存する必要があるため、ユーザーがクライアントでこのエンティティを更新した場合、更新前に選択する必要はありません。この場合、特定のエンティティを保存しているので、エンティティのキャッシュと見なされますよね?保存したい場合
そのために私たちは使用しています:
@Cacheable (true)
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
public class MyEntity implements Serializable
{
...
}
私はこれらの仮定を正しく行っていますか?そうでない場合、ここでのアプローチは何ですか?私はこれから大きな混乱を引き起こしていると思います。