Java 可以在mongodb 2.6+;是否用作缓冲区/队列?

Java 可以在mongodb 2.6+;是否用作缓冲区/队列?,java,multithreading,mongodb,Java,Multithreading,Mongodb,MongoDB从2.6版开始引入,我检查了API,对我来说很好 在此API之前,如果需要进行批量插入,我必须将文档存储在列表中,它们使用insert()插入整个列表。在多线程环境中,还应考虑并发性 批量API中是否实现了队列/缓冲区?每次我 在execute()之前将某些内容放入批量,数据存储为int 他是队列/缓冲区,对吗 因此,我不需要编写自己的队列/缓冲区,只需使用Bulk.insert()或Bulk.find().update(),对吗 有人能告诉我更多关于排队的情况吗。我还需要关注并发

MongoDB从2.6版开始引入,我检查了API,对我来说很好

在此API之前,如果需要进行批量插入,我必须将文档存储在列表中,它们使用
insert()
插入整个列表。在多线程环境中,还应考虑并发性

  • 批量API中是否实现了队列/缓冲区?每次我 在execute()之前将某些内容放入批量,数据存储为int 他是队列/缓冲区,对吗
  • 因此,我不需要编写自己的队列/缓冲区,只需使用
    Bulk.insert()
    Bulk.find().update()
    ,对吗
  • 有人能告诉我更多关于排队的情况吗。我还需要关注并发性问题吗
  • 由于批量是像db.collection.initializeUnderedBulkop()那样创建的,因此如果批量实例未发布,它将保持与MongoDB服务器的连接,对吗
  • 从“您需要存储自己的列表吗?”这一基本概念来看,这并不是真的,但我想这一切都取决于您正在做什么

    对于在下发生的事情的内部结构的基本概念,最好的地方是查看每个组件的单个命令表单。因此,相关的手册部分是

    因此,您可以将接口视为添加到其中的所有操作的列表或集合。你可以在你希望的范围内增加(在一定的内存和实际的约束条件下),并考虑这个“队列”的“排水”方法是方法。 如文档中所述,无论您“排队”了多少个操作,每次最多只能将1000个操作分组发送到服务器。要记住的另一件事是,没有任何治理可以确保这1000个操作请求实际上符合16MB BSON限制。因此,这仍然是MongoDB的一个硬限制,在发送到服务器时,一次只能有效地形成一个总大小小于该数据限制的“请求”

    因此,一般来说,每1000个或更少的条目向服务器发出一次您自己的“执行/排出”请求通常更为实际。里程数可能会有所不同,但这里需要考虑一些因素

    对于“有序”或“无序”操作请求,在前一种情况下,如果发送的批处理中生成错误,将中止所有排队操作。当然,这意味着遇到错误后发生的所有操作

    在后一种情况下,对于“无序”操作,没有报告致命错误,但是在返回的操作中,除了“无序”意味着操作不一定按任何特定顺序“应用”,这意味着您不能“排队”之外,您还可以得到一个遇到的任何错误的“列表”在应用该操作之前,依赖于正在处理的“队列”中其他内容的操作

    因此,需要关注的是您将获得多大的WriteResult,以及您在应用程序中如何处理该响应。如前所述,里程可能因其重要性而有所不同,这是一个非常大的响应,而不是一个较小且可管理的响应

    目前为止,考虑到并发性,这里确实有一件事要考虑。即使您在一次呼叫中向服务器发送多条指令,并且不等待单独的传输和确认,它仍然一次只处理一条指令。这些操作要么是initialize方法所暗示的有序的,要么是选择的“非有序的”,当然,这些操作可以像在服务器上一样“并行”运行,直到批处理耗尽为止

    但是在“批处理”完成之前没有“锁”,所以它不能替代“事务”,所以不要把这个错误作为设计点。同样的MongoDB规则也适用,但这里的好处是“一次写入服务器”和“一次响应”,而不是每个操作一次

    最后,至于API在这里是否有一些“服务器连接”,那么答案是不存在。正如查看命令内部的初始点所指出的,这个“队列”构建纯粹是“仅客户端”。在调用
    .execute()
    方法之前,不会以任何方式与服务器进行通信。这是“按设计”的,实际上是重点的一半,因为我们不希望每次添加操作时都向服务器发送数据。这是一次完成的

    因此,“批量操作”是一个“客户端队列”。所有内容都存储在客户端,直到
    .execute()
    “排出”队列并将操作一次发送到服务器。然后,服务器将给出一个响应,其中包含所发送操作的所有结果,您可以按照自己的意愿处理这些结果

    此外,一旦调用了
    .execute()
    ,就不能再将操作“排队”到批量对象,也不能再次调用
    .execute()
    。根据实现的不同,您可以对“批量”对象和结果进行进一步的检查。但一般情况下,您需要发送更多的“批量”操作,然后重新初始化并重新启动,就像大多数队列系统一样

    总结:

  • 对。对象有效地“排队”操作
  • 你不需要自己的清单。这些方法本身就是“列表生成器”
  • 操作的顺序可以是“有序”或“无序”,但所有操作都由服务器按照正常的MongoDB规则单独处理。没有交易
  • “initialize”命令不直接与服务器通信,也不“保持连接”。唯一的方法是