4

我想将 spring mongodb 中的 WriteConcern 设置为确认。另外,我想知道这是否是默认值?我在 application.properties 中使用 spring.data.mongodb.uri 所以我没有任何 mongo 配置类。

4

4 回答 4

3

从这里的 SpringData 文档

9.4.3。WriteConcern 如果尚未通过更高级别的驱动程序(例如 com.mongodb.Mongo)指定,您可以设置 MongoTemplate 将用于写入操作的 com.mongodb.WriteConcern 属性。如果 MongoTemplate 的 WriteConcern 属性未设置,它将默认为 MongoDB 驱动程序的 DB 或 Collection 设置中的设置。

9.4.4。WriteConcernResolver 对于更高级的情况,您希望在每个操作的基础上设置不同的 WriteConcern 值(用于删除、更新、插入和保存操作),可以在 MongoTemplate 上配置一个称为 WriteConcernResolver 的策略接口。由于 MongoTemplate 用于持久化 POJO,因此 WriteConcernResolver 允许您创建可以将特定 POJO 类映射到 WriteConcern 值的策略。WriteConcernResolver 接口如下所示。

public interface WriteConcernResolver {
 WriteConcern resolve(MongoAction action);
}

在这里找到一个直接的实现

于 2017-02-22T13:40:13.040 回答
3

你可以通过 Spring bean 做到这一点

@Configuration
public class MongoConfiguration {

@Bean
public WriteConcernResolver writeConcernResolver() {
    return action -> {
        System.out.println("Using Write Concern of Acknowledged");
        return WriteConcern.ACKNOWLEDGED;
    };
}

}
于 2017-04-24T09:06:17.757 回答
1

WriteConcernResolver仅提供over Bean 配置是不够的。MongoTemplate不会使用它。要做到这一点,您必须创建一个像这样的类,其中包含两个选项来设置WriteConcern

import com.mongodb.WriteConcern;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.WriteResultChecking;
import org.springframework.data.mongodb.core.convert.MongoConverter;

@Configuration
public class MongoConfiguration {
    Logger logger = LoggerFactory.getLogger(MongoConfiguration.class);

    public MongoConfiguration() {
        logger.info("MongoConfiguration applied  ...");
    }

    @Bean
    MongoTemplate mongoTemplate(MongoDatabaseFactory mongoDbFactory, MongoConverter converter) {
        MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory, converter);+
        // Version 1: set statically
        logger.debug("Setting WriteConcern statically to ACKNOWLEDGED");
        mongoTemplate.setWriteConcern(WriteConcern.ACKNOWLEDGED);
        // Version 2: provide a WriteConcernResolver, which is called for _every_ MongoAction
        // which might degrade performance slightly (not tested)
        // and is very flexible to determine the value
        mongoTemplate.setWriteConcernResolver(action -> {
            logger.debug("Action {} called on collection {} for document {} with WriteConcern.MAJORITY. Default WriteConcern was {}", action.getMongoActionOperation(), action.getCollectionName(), action.getDocument(), action.getDefaultWriteConcern());
            return WriteConcern.ACKNOWLEDGED;
        });
        mongoTemplate.setWriteResultChecking(WriteResultChecking.EXCEPTION);
        return mongoTemplate;
    }
}
于 2021-03-22T09:20:20.473 回答
1

您可以在 xml-configuration 中设置 write-concern(如果适用)

<mongo:db-factory ... write-concern="SAFE"/>
于 2018-08-26T20:26:15.000 回答