如何解决Ehcache 的 DynamicAttributesExtractor 似乎没有索引提取的值
我将 ehcache (2.10.6) 与 DynamicAttributeExtractor
一起使用,以便能够按字段搜索缓存元素。 Doc says DynamicAttributeExtractor
将在每次 put()
和 replace()
方法调用时被调用一次,并且 ehcache 将索引返回的属性值,所以我希望当我执行查询时通过此提取器生成的某些属性,ehcache 将使用该属性索引并快速返回匹配的元素,而无需遍历所有缓存项。
当我测试时,我看到我的提取器在每个 put()
方法调用中被预期调用并返回所需的属性值,但是当我通过这个属性执行查询时,我看到提取器被调用对每个下一个查询重复一遍又一遍。
我在 ehcache.xml 中的缓存配置
<ehcache ...>
<defaultCache
maxEntriesLocalHeap="10000"
eternal="false"
memoryStoreevictionPolicy="LRU">
<pinning store="inCache" />
<persistence strategy="localTempSwap"/>
</defaultCache>
<cache name="users"
maxBytesLocalHeap="1G"
eternal="false"
timetoLiveSeconds="43200"
memoryStoreevictionPolicy="LRU">
<pinning store="inCache" />
<persistence strategy="none"/>
<searchable keys="true" values="false" allowDynamicIndexing="true"/>
</cache>
</ehcache>
private static final String FULL_NAME_ATTR = "fullName";
public static void main(String[] args) {
final CacheManager cacheManager = CacheManager.newInstance(".../ehcache.xml");
final Cache users = cacheManager.getCache("users");
// register extractor that will extract user's full name into attribute 'fullName'
users.registerDynamicAttributesExtractor(new DynamicAttributesExtractor() {
@Override
public Map<String,Object> attributesFor(Element element) {
final Map<String,Object> attrs = new HashMap<>();
final User user = (User) element.getobjectValue();
attrs.put(FULL_NAME_ATTR,user.getFirstName() + " " + user.getLastName());
return attrs;
}
});
// fill the cache; the extractor is called on each put() call
users.put(new Element(1,new User("John","Doe")));
users.put(new Element(2,new User("user1","user1")));
users.put(new Element(3,new User("user2","user2")));
users.put(new Element(4,new User("user3","user3")));
// find John Doe,the extractor is called again,why?
// Didn't it already extract this attribute when John Doe has been put into cache?
findByFullName("John Doe",users).forEach(result -> System.out.println(result.getValue()));
// and again...
findByFullName("John Doe",users).forEach(result -> System.out.println(result.getValue()));
}
private static List<Result> findByFullName(String fullName,Cache cache) {
return cache.createquery()
.addCriteria(cache.getSearchAttribute(FULL_NAME_ATTR).eq(fullName))
.includeValues()
.execute()
.all();
}
我是否正确理解“DynamicAttributeExtractor 索引属性值”的含义?如果是这样,为什么当元素进入缓存时会调用提取器,而ehcache不会以任何方式使用提取的属性值?
这种查询的性能很差,因为每次都是对缓存的所有元素进行迭代,根本没有任何索引。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。