【问题标题】:Spring data Mongodb bulk save continue on errorSpring数据Mongodb批量保存错误继续
【发布时间】:2017-08-14 10:16:25
【问题描述】:

我正在使用 spring-data-mongodb 并且有一个简单的存储库,它配置了以下配置:

@Configuration
@EnableMongoRepositories(basePackages = "com.my.package")
@Profile("default")
public class MongoConfig extends AbstractMongoConfiguration {

    @Value("${mongo.db.uri}")
    private String mongoDbUri;
    @Value("${mongo.db.database}")
    private String mongoDbDatabaseName;

    @Override
    protected String getDatabaseName() {
        return mongoDbDatabaseName;
    }

    @Override
    public MongoClient mongoClient() {
        return new MongoClient(new MongoClientURI(mongoDbUri));
    }
}

使用的存储库扩展了 CrudRepository,这使得我可以调用 saveAll() 方法。默认情况下,当一条记录失败时,在 mongodb 中执行 saveAll(批量操作)将停止,除非将选项传递给 insertMany/updateMany 命令以使“continueOnError”为 true 或具有“BulkMode.unordered”。有什么方法可以将 spring 数据配置为始终在出错时继续(或始终进行无序插入/更新),这样即使某些记录失败,执行 saveAll 也将始终尝试整个批量?

谢谢!

【问题讨论】:

标签: mongodb spring-data-mongodb


【解决方案1】:

要进行 MongoDB 批量写入(能够选择无序操作,从而允许写入在批量组中的一项失败后继续),您需要使用 org.springframework.data.mongodb.core.BulkOperations(可从 Spring Data 获得>= 1.9.0.RELEASE)

例如:

BulkOperations bulkOperations = mongoTemplate.bulkOps(BulkMode.UNORDERED, YourDomainObjectClass.class);
for (YourDomainObject ydo : yourDomainObjects) {
    bulkOperations.insert(ydo);
}
BulkWriteResult result = bulkOperations.execute();
// inspect the result
if (result.getInsertCount() != yourDomainObjects.size()) {
    // oh oh
}

如果您使用的是 Spring Data 版本 DBCollection(可通过 MongoOperations.getCollection() 获得)并使用标准驱动程序调用,例如:

BulkWriteOperation bulkWriteOperation = collection.initializeUnorderedBulkOperation();
for (YourDomainObject ydo : yourDomainObjects) {
    bulkWriteOperation.insert(ydo);    
}
BulkWriteResult result = bulkWriteOperation.execute();
// inspect the result
if (result.getInsertCount() != yourDomainObjects.size()) {
    // oh oh
}

【讨论】:

  • 我正在尝试继续使用 spring-data 存储库提供的 saveAll 方法,并且想知道是否可以将其配置为始终使用无序模式。使用您的解决方案,我必须自己实现 saveAll 方法,这是我想要阻止的。我只是想以某种方式将 Spring 配置为始终执行无序批量插入,但这可能是不可能的。
  • 是的,目前使用 Spring Data 是不可能的。我认为您必须实现自己的“批量感知”saveAll(),上面的答案提供了两种实现方法。
猜你喜欢
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
相关资源
最近更新 更多