我有一个简单的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--")
然后在我的测试代码中(在actor之外运行 - 在另一个线程中)我打印出我找到的记录数:
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
因此,在尝试读取之前,完整的2秒(并且应该已经写完)显然发生了3次保存。
我理解更自由的WriteConcerns你可以得到这种行为,但我认为最安全的两个可以保证写入实际发生在继续之前。
答案 0 :(得分:0)
微妙但简单的问题。我正在使用def创建我的连接...然后我继续调用两次,好像它是一个val。所以我实际上有两个不同的作家,所以解释了我的结果中的有时差异。重构为val,一切都是可预测的。痛苦识别,易于理解/修复。