Spring数据mongodb-设置查询超时
在DBCursor中有一个使用maxTime()方法终止慢速查询的选项,我们在SpringDataMongoDB查询中是否有一个等效的方法 我必须在Spring data mongodb中终止特定的慢速查询 请提供您的建议Spring数据mongodb-设置查询超时,mongodb,spring-data-mongodb,Mongodb,Spring Data Mongodb,在DBCursor中有一个使用maxTime()方法终止慢速查询的选项,我们在SpringDataMongoDB查询中是否有一个等效的方法 我必须在Spring data mongodb中终止特定的慢速查询 请提供您的建议 谢谢。有一个开放的票证支持cursor.maxTime(请参阅) 您可以使用自己的CursorPreparer添加所需的数据。你必须调整几个类 class MyQuery extends Query { long timeout; } class MyCursorP
谢谢。有一个开放的票证支持
cursor.maxTime
(请参阅)
您可以使用自己的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));
}
}
类MyQuery扩展了查询{
长超时;
}
类MyCursorPreparer实现CursorPreparer{
私有最终查询;
私有最终类类型;
公共MyCursorPreparer(查询,类类型){
this.query=query;
this.type=type;
}
@凌驾
公共数据库游标准备(数据库游标){
//添加超时选项
if(MyQuery的查询实例){
长超时=((MyQuery)查询)。超时;
如果(超时>0){
cursor=cursor.maxTime(超时,时间单位为秒);
}
}
//…做其他准备工作
返回光标;
}
}
类MyTemplate扩展了MongoTemplate{
公共MyTemplate(Mongo Mongo,字符串数据库名){
super(mongo,databaseName);
}
@凌驾
公共列表查找(最终查询、类entityClass、字符串集合名称){
if(查询==null){
返回findAll(entityClass,collectionName);
}
返回doFind(collectionName,query.getQueryObject(),
query.getFieldsObject(),entityClass,
新的MyCursorPreparer(查询,entityClass));
}
@凌驾
public void executeQuery(查询查询、字符串集合名称、DocumentCallbackHandler dch){
executeQuery(查询,collectionName,dch,新建MyCursorPreparer(查询,null));
}
}