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>

这使用休眠搜索和 apache lucene 来查询您的 infinispan 缓存。

要使用它,您需要使用 注释要搜索的字段@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 回答