【问题标题】:How do I deal with greedy write locking in MongoDB?如何处理 MongoDB 中的贪婪写锁定?
【发布时间】:2014-04-07 17:31:24
【问题描述】:

我的问题 - 有没有办法同时读取和写入 MongoDB?还是让 MongoDB 阅读器变得贪婪?

我有一个使用 MongoDB 作为数据库的 Web 应用程序。在我的应用程序中,我有一个正在监听的串行事件。在此串行事件中,我创建了一个新线程来处理该事件。在线程中,解析来自 serial 的字符串并创建一个对象,然后将其写入 mongo 数据库(创建一个新文档并将其添加到特定集合中)。

但是,在发生此串行事件时,我还尝试从数据库中读取数据并更新图表以显示来自该集合的新传入数据。问题在于,由于 MongoDB 是贪写者(参见 http://docs.mongodb.org/manual/faq/concurrency/),似乎永远不允许发生读取。

我的连续事件大约每秒发生 2/3 次。我的阅读速度也大约每秒 2 次。数据需要保持写入数据库,以便所有客户端都可以访问它,而不仅仅是接收串行事件的客户端。

所以我的问题是,有没有办法让我阅读我可以将 MongoDB 上的锁更改为读者贪婪吗?或者有没有一种方法可以在不影响速度的情况下同时读写?分片是否可以解决这个问题(我对分片了解不多,所以不确定这是否能解决我的问题)?

如果您想发布任何代码,请告诉我!任何 cmets 或解决方法将不胜感激!

【问题讨论】:

    标签: java mongodb locking read-write readwritelock


    【解决方案1】:

    你是说你的阅读根本没有通过吗?到底发生了什么?是的,每个数据库的 mongodb 写锁可能会导致问题,但通常比您正在讨论的事务级别要高得多。

    您的读者需要多快才能看到新写入的对象?如果您可以处理一些延迟,您可以读取副本集辅助节点。并非没有它自己的问题(特别是处理复制滞后),它可以帮助处理只读查询。

    我还会考虑查看 mongostat 和 mongotop 的输出,以了解数据库锁定的时间量以及正在使用哪些集合。

    【讨论】:

    • 感谢您的回复。我的系统每秒向数据库写入大约 70 次,因此我认为我的读取从未通过。然而,这实际上是我程序中的另一个问题。它在我的 JSP 页面中 - 当我收到数据时,绘制图表需要很长时间,因此它减慢了请求更多数据方法的速度。这与 MongoDB 无关。
    猜你喜欢
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多