mongodb - 如何使用mongodb java客户端锁定集合

时间:2013-04-16 04:30:08

标签: java mongodb mongodb-java

我需要在后台线程中同时更新整个集合,但是读取操作可能同时发生。我对它进行基准测试时更新集合大约需要3秒钟。有没有办法在更新集合时锁定集合?我尝试创建一个新的集合并将所有文档插入其中并使用“dropToTarget = true”将其重命名为原始集合,但我不确定它在分片方面是多么安全和稳定。我读到renameCollection与分片不兼容。

如果有人可以建议是否有好主意,那就太好了。

感谢。

1 个答案:

答案 0 :(得分:0)

您是否提出了两种可能的策略来更新您的收藏,一种是内联锁定,另一种是临时收藏?

正如mongodb文档明确指出它不适用于分片集合(http://docs.mongodb.org/manual/reference/command/renameCollection/)。根据我的理解,这意味着您要重命名的集合不会被分片,因为您需要在执行实际重命名之前删除其他集合,您最可能会松散之前保留的任何分片(-information)。所以你需要重新激活分片。我强烈反对使用这两种收集方法,特别是如果你正在分析你的数据 您需要从分片集合中获取所有数据并将其集中存储,一旦完成更新,您需要重命名集合并再次对其进行分片。这将为整个系统带来大量I / O,尤其是对于进行更新的客户端。

取决于您的系统架构(具有单一入口点)。您可以轻松地持有一些全局标记,告诉您当前是否正在运行集合更新。禁止其他写操作。
对于进入MongoDB的多入口点,您可以尝试$ isolated,但这不适用于分片集合。而且我不确定它是否允许读取操作,文档不是很清楚。

在更新过程中是否严格禁止写入任何数据?您执行的是哪种类型的更新。他们可以相互影响吗?或者是否可以进行并发写入?