1

件名は質問です。

シナリオ : ログアウト リンクがあっても、一部のユーザーが正しくログアウトしません。そしてすぐに新しいタブを開き、再度ログインします。今回は、新しい Cache オブジェクトが作成され、古いオブジェクトは破棄されません。

4

1 に答える 1

0

まず、デフォルトを設定する lifespanmaxIdle、すべてのエンティティをタイムアウトにして、エンティティが長期間古くならないようにすることができます。

ただし、質問に答えるには...infinispan-queryモジュールを使用できます。

     <dependency>
        <groupId>org.infinispan</groupId>
        <artifactId>infinispan-query</artifactId>
        <version>5.2.1.Final</version>
     </dependency>

これは、hibernate search と apache lucene を使用して、インフィニスパン キャッシュをクエリします。

これを使用するには、検索するフィールドに で注釈を付け@org.hibernate.search.annotations.Field、クラスに で注釈を付ける必要があります@org.hibernate.search.annotations.Indexed

Infinispan キャッシュにもインデックスを作成する必要があります<indexing enabled="true" indexLocalOnly="false" />(ローカルまたは分散 -indexLocalOnlyプロパティを参照してください)。

次に、次のような方法でキャッシュをクエリできます。

import org.apache.lucene.search.Query;
import org.hibernate.search.query.dsl.QueryBuilder;
import org.infinispan.Cache;
import org.infinispan.query.CacheQuery;
import org.infinispan.query.Search;
import org.infinispan.query.SearchManager;

[...]

public List<YourEntity> searchEntities( String fieldValue ) {
  SearchManager searchManager = Search.getSearchManager( cache );
  QueryBuilder queryBuilder = searchManager.buildQueryBuilderForClass( YourEntity.class ).get();
  // this chain will change depending on what you are querying
  Query luceneQuery = queryBuilder.keyword().onField( "fieldName" ).matching( fieldValue ).createQuery();
  // use either searchManager.getClusteredQuery with local index, or a searchManager.getQuery with clustered index
  CacheQuery cacheQuery = searchManager.getQuery( luceneQuery, YourEntity.class );
  //noinspection unchecked
  return (List)cacheQuery.list();
}
于 2013-06-04T02:03:58.033 に答える