Spring数据mongodb - 设置查询超时

时间:2014-08-07 17:04:32

标签: mongodb spring-data-mongodb

有一个选项可以使用maxTime()方法在DBCursor中终止慢查询,我们在Spring数据mongodb查询中是否有等效的方法。

我必须在Spring数据mongodb中杀死特定的慢查询。

请提供您的建议。

感谢。

1 个答案:

答案 0 :(得分:1)

cursor.maxTime支持的开放式门票(见DATAMONGO-957)。

您可以使用自己的CursorPreparer添加所需数据。你必须调整一些课程。

class MyQuery extends Query {
    long timeout;
}

class MyCursorPreparer implements CursorPreparer {

    private final Query query;
    private final Class<?> type;

    public MyCursorPreparer(Query query, Class<?> type) {

        this.query = query;
        this.type = type;
    }

    @Override
    public DBCursor prepare(DBCursor cursor) {

        // add timeout options
        if (query instanceof MyQuery) {
            long timeout = ((MyQuery) query).timeout;
            if (timeout > 0) {
                cursor = cursor.maxTime(timeout, TimeUnit.SECONDS);
            }
        }

        // ... do other preparation stuff

        return cursor;
    }
}

class MyTemplate extends MongoTemplate {

    public MyTemplate(Mongo mongo, String databaseName) {
        super(mongo, databaseName);
    }

    @Override
    public <T> List<T> find(final Query query, Class<T> entityClass, String collectionName) {

        if (query == null) {
            return findAll(entityClass, collectionName);
        }

        return doFind(collectionName, query.getQueryObject(), 
          query.getFieldsObject(), entityClass, 
          new MyCursorPreparer(query, entityClass));
    }

    @Override
    public void executeQuery(Query query, String collectionName, DocumentCallbackHandler dch) {
        executeQuery(query, collectionName, dch, new MyCursorPreparer(query, null));
    }

}