Oracle Coherence索引无法使用ContainsFilter查询

时间:2015-04-08 17:04:39

标签: indexing filter oracle-coherence

我已经为缓存添加了一个索引。索引使用自定义提取器扩展AbstractExtractor并仅覆盖提取方法以返回字符串列表。然后我有一个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);
}

1 个答案:

答案 0 :(得分:0)

我通过向DependencyIdExtractor类添加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索引/查询,您可以生成类似于数据库查询解释计划的解释计划。

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);
    }