mongodb 3.2.2 版本批量写入或更新

本文介绍MongoDB从3.0版本起支持的同步与异步写入更新功能,重点讲解了异步批量写入的实现方式及注意事项,包括使用Netty或AsynchronousSocketChannel进行非阻塞式IO操作,以及如何通过回调函数确保批量写入操作的成功执行。
摘要由CSDN通过智能技术生成

   mongodb java driver 从3.0开始,支持同步、异步写入更新。这两个driver使用的包不一样。比如异步的需要用async包。如下:

<dependency>
      <groupId>org.mongodb</groupId>
      <artifactId>mongodb-driver-async</artifactId>
      <version>${mongo.version}</version>
    </dependency>

     MongoDB异步驱动利用Netty或Java7的AsynchronousSocketChannel 来提供一个支持异步的API,以支持快速的、非阻塞式的IO操作。该API形式和MongoDB同步驱动的新API保持一致,但是任何会导致网络IO的方法都会有一个SingleResponseCallback并且会立即返回,其中T是响应对于该文档的类型的任何方法。SingleResponseCallback  回调接口需要实现一个简单方法onResult(T result, Throwable t) ,这个方法在操作完成时被调用。其中,如果操作成功, result参数包含着操作结果;如果操作失败,t中包含着抛出的异常信息。这段参考摘自《https://cloud.tencent.com/developer/article/1014557

      在使用mongodb异步批量写入的时候,必须实现回调函数,否则无法保证这次批量写入更新是否成功或者出现异常,如果出问题,就是出现这次批量写入更新有一部分执行完成了,一部分被中断没被执行。因为批量写入更新都是不保证事务。mongodb这边能保证的事务,默认是1000条每次。所以能看到的就是mongdb在批量写入表数量增长的步长是1000,也可以看mongdb server 的log,每次处理是1000条。

       

批量操作

   批量操作允许批量的执行 插入、更新、删除操作。批量操作有两种类型:

  1. 有序的批量操作

       有序的执行所有操作并在第一个写操作的错误处报告错误。

  1. 无序的批量操作

       执行所有的操作并报告任何错误。无序的批量操作不保证执行顺序。

我们来围观一下两个分别使用有序和无序操作的简单例子:

先定义回调函数,打印
​​​​​​​SingleResultCallback<BulkWriteResult> printBatchResult = new SingleResultCallback<BulkWriteResult>() {
    @Override
    public void onResult(final BulkWriteResult result, final Throwable t) {
        System.out.println(result);
        //在这个地方可以调用result,获取是否write执行完成,以及此次执行更新的条数
        //或者这次批量更新出现,返回的异常信息,从t中可以获取
    }
};

// 2. 有序批量操作
collection.bulkWrite(
  Arrays.asList(new InsertOneModel<>(new Document("_id", 4)),
                new InsertOneModel<>(new Document("_id", 5)),
                new InsertOneModel<>(new Document("_id", 6)),
                new UpdateOneModel<>(new Document("_id", 1),
                                     new Document("$set", new Document("x", 2))),
                new DeleteOneModel<>(new Document("_id", 2)),
                new ReplaceOneModel<>(new Document("_id", 3),
                                      new Document("_id", 3).append("x", 4))),
  printBatchResult
);


 // 2. 无序批量操作
collection.bulkWrite(
  Arrays.asList(new InsertOneModel<>(new Document("_id", 4)),
                new InsertOneModel<>(new Document("_id", 5)),
                new InsertOneModel<>(new Document("_id", 6)),
                new UpdateOneModel<>(new Document("_id", 1),
                                     new Document("$set", new Document("x", 2))),
                new DeleteOneModel<>(new Document("_id", 2)),
                new ReplaceOneModel<>(new Document("_id", 3),
                                      new Document("_id", 3).append("x", 4))),
  new BulkWriteOptions().ordered(false),
  printBatchResult
);

重要提示

     不推荐在pre-2.6的MongoDB 服务器上使用 bulkWrite 方法。因为这是第一个支持批量写操作(插入、更新、删除)的服务器版本,它允许驱动去实现 BulkWriteResultBulkWriteException 的语义。这个方法虽然仍然可以在pre-2.6服务器上工作,但是性能不好,一次只能执行一个写操作。

       

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值