Oracle Coherence 索引不适用于 ContainsFilter 查询

Oracle Coherence index not working with ContainsFilter query

我已将索引添加到缓存中。该索引使用自定义提取器,该提取器扩展了 AbstractExtractor 并仅将提取方法覆盖到 return 字符串列表。然后我有一个 ContainsFilter,它使用相同的自定义提取器来查找字符串列表中单个字符串的出现。根据执行测试所需的时间,我的索引似乎没有被使用。我究竟做错了什么?另外,是否有一些调试我可以打开以查看使用了哪些索引?

public class DependencyIdExtractor extends AbstractExtractor {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    public Object extract(Object oTarget) {
        if (oTarget == null) {
            return null;
        }
        if (oTarget instanceof CacheValue) {
            CacheValue cacheValue = (CacheValue)oTarget;
            // returns a List of String objects
            return cacheValue.getDependencyIds();
        }
        throw new UnsupportedOperationException();
    }
}

添加索引:

mCache = CacheFactory.getCache(pCacheName);
mCache.addIndex(new DependencyIdExtractor(), false, null);

正在执行 ContainsFilter 查询:

public void invalidateByDependencyId(String pDependencyId) {
    ContainsFilter vContainsFilter = new ContainsFilter(new DependencyIdExtractor(), pDependencyId);
    @SuppressWarnings("rawtypes")
    Set setKeys = mCache.keySet(vContainsFilter);
    mCache.keySet().removeAll(setKeys);
}

我通过向 DependencyIdExtractor class 添加 hashCode 和 equals 方法实现来解决这个问题。添加索引和创建过滤器时使用完全相同的值提取器很重要。

public class DependencyIdExtractor extends AbstractExtractor {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    public Object extract(Object oTarget) {
        if (oTarget == null) {
            return null;
        }
        if (oTarget instanceof CacheValue) {
            CacheValue cacheValue = (CacheValue)oTarget;
            return cacheValue.getDependencyIds();
        }
        throw new UnsupportedOperationException();
    }

    @Override
    public int hashCode() {
        return 1;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (obj instanceof DependencyIdExtractor) {
            return true;
        }
        return false;
    }
}

要调试 Coherence indices/queries,您可以生成类似于数据库查询解释计划的解释计划。

http://www.oracle.com/technetwork/tutorials/tutorial-1841899.html

@SuppressWarnings("unchecked")
    public void invalidateByDependencyId(String pDependencyId) {
        ContainsFilter vContainsFilter = new ContainsFilter(new DependencyIdExtractor(), pDependencyId);

        if (mLog.isTraceEnabled()) {
            QueryRecorder agent = new QueryRecorder(RecordType.EXPLAIN); 
            Object resultsExplain = mCache.aggregate(vContainsFilter, agent);

            mLog.trace("resultsExplain = \n" + resultsExplain + "\n");
        }

        @SuppressWarnings("rawtypes")
        Set setKeys = mCache.keySet(vContainsFilter);
        mCache.keySet().removeAll(setKeys);
    }