0

我有一个简单的 mongo 应用程序,它恰好是异步的(使用 Akka)。我向演员发送一条消息,该演员又将 3 条记录写入数据库。我正在使用 WriteConcern.SAFE,因为我想确保写入发生(也尝试过 WriteConcern.FSYNC_SAFE)。

我暂停了一秒钟,让写操作发生,然后读一读——什么也没得到。

所以我的写代码可能是:

collection.save( myObj, WriteConcern.SAFE )
println("--1--")
collection.save( myObj, WriteConcern.SAFE )
println("--2--")
collection.save( myObj, WriteConcern.SAFE )
println("--3--")

然后在我的测试代码中(在演员之外运行 - 在另一个线程中)我打印出我找到的记录数:

println( collection.findAll(...) )

我的输出如下所示:

--1--
--2--
--3--
(pauses)
0

事实上,如果我查看数据库,我看不到任何记录。 有时我确实在那里看到了数据并且测试有效。异步代码可能很棘手,并且有可能在写入发生之前测试代码已经被命中,所以我还尝试打印出时间戳以确保它们按照呈现的顺序执行——它们是。数据应该在那里。以下带有时间戳的示例输出:

Saved: brand_1 / dev  1375486024040
Saved: brand_1 / dev2 1375486024156
Saved: brand_1 / dev3 1375486024261
                      1375486026593 0 found

因此,在尝试读取之前,3 次保存显然发生(并且应该写入)整整 2 秒。

我理解对于更自由的 WriteConcerns,您可能会得到这种行为,但我认为两个最安全的行为会向我保证写入实际上是在继续之前发生的。

4

1 回答 1

0

微妙但简单的问题。我正在使用 def 来创建我的连接......然后我继续调用它两次,就好像它是一个 val。所以我实际上有 2 个不同的作家,这解释了我的结果有时会有所不同。重构为 val,一切都是可预测的。难以识别,易于理解/修复。

于 2013-08-26T18:36:03.703 回答