【问题标题】:How do you set WriteConcern using spring mongodb to ACKNOWLEDGED?如何使用 spring mongodb 将 WriteConcern 设置为 ACKNOWLEDGED?
【发布时间】:2017-01-16 08:43:38
【问题描述】:

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

【问题讨论】:

    标签: spring-mongodb


    【解决方案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;
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      <mongo:db-factory ... write-concern="SAFE"/>
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          来自 SpringData 的文档here

          9.4.3。写关注 如果尚未通过更高级别的驱动程序(例如 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);
          }
          

          找到直接实现here

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-02-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多