1

次のプロパティを使用して、休止状態で第 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 に変更しましたが、同じ動作が見られます。

最初のリクエストでは、エンティティを選択するためのクエリと、コレクションのサイズを見つけるためのクエリが表示されます。エンティティがキャッシュされていることを示すログ メッセージが表示されます。

後続のリクエストでは、エンティティをロードするための呼び出しはありませんが、コレクションのサイズを見つけるための呼び出しはまだあります。

4

2 に答える 2

-1

ユーザーのリストは、遅延ロードされたコレクションです。遅延ロードされたコレクションには、データはありません。遅延読み込みコレクションにアクセスする場合、または遅延読み込みコレクションのサイズを確認する場合は常に、要素の数など、内部のデータに関する情報が必要です。このため、データベースからそのデータを取得するため、毎回データベースクエリが生成されます。最上位レベルと他のオブジェクトの内部の両方でリストを確認しました。これは、Listが最上位のオブジェクトでない場合、遅延して初期化されることを示しています。したがって、コレクションまたはコレクションから情報を取得する場合は常に、データベースクエリが生成されます。

于 2013-03-04T09:02:22.637 に答える
-1

データがキャッシュされている場合、データベース クエリは表示されません。選択クエリの継続的なログがあると言っています。Ehcache はトランザクション キャッシュを提供しません。そして、あなたはそれが機能していると言っています。ブラザーは、データベース呼び出しと同じログを持っているだけで機能していません。 TRANSACTIONAL キャッシングをサポートしていないため、Ehcache のドキュメントを確認してください。

于 2013-03-01T10:40:36.357 に答える