主题是问题。
场景:即使有注销链接,某些用户也没有正确注销。他们立即使用新标签并再次登录。这次创建了一个新的 Cache 对象,而旧的对象并没有被破坏。
主题是问题。
场景:即使有注销链接,某些用户也没有正确注销。他们立即使用新标签并再次登录。这次创建了一个新的 Cache 对象,而旧的对象并没有被破坏。
首先,您可以设置默认值 lifespan
或maxIdle
使所有实体超时,这样它们就不会长时间保持陈旧状态。
但是,要回答您的问题...您可以使用该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();
}