次のプロパティを使用して、休止状態で第 2 レベルのキャッシュを有効にしました。
hibernateProperties.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.EhCacheRegionFactory");
hibernateProperties.setProperty("hibernate.cache.use_query_cache", Boolean.TRUE.toString());
hibernateProperties.setProperty("hibernate.cache.use_second_level_cache", Boolean.TRUE.toString());
hibernateProperties.setProperty("hibernate.cache.use_structured_entries", Boolean.TRUE.toString());
hibernateProperties.setProperty("hibernate.cache.generate_statistics", Boolean.TRUE.toString());
そして、キャッシュ タグを使用してエンティティにタグを付けました。
@Entity
@Indexed
@Table(name = "item")
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
public class Item implements Serializable {
このエンティティには、レイジー コレクション オプションが追加されたレイジー コレクションがあります。
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
@ManyToMany(fetch = FetchType.LAZY, targetEntity = User.class, mappedBy = "likes")
@LazyCollection(LazyCollectionOption.EXTRA)
private List<User> users;
これはうまく機能しているようで、データがキャッシュされた後にデータベース クエリは表示されませんが、表示されるのは呼び出しのログです。
select count(user_id) from user_items where item_id =?
users.size() を実行するときにデータベースにヒットする必要がないように、休止状態で遅延コレクションのサイズをキャッシュする方法はありますか?
CacheConcurrencyStrategy.READ_WRITE に変更しましたが、同じ動作が見られます。
最初のリクエストでは、エンティティを選択するためのクエリと、コレクションのサイズを見つけるためのクエリが表示されます。エンティティがキャッシュされていることを示すログ メッセージが表示されます。
後続のリクエストでは、エンティティをロードするための呼び出しはありませんが、コレクションのサイズを見つけるための呼び出しはまだあります。