次のテストがあります
@Test
public void testPutDocuments() throws Exception {
final DBObject document01 = new DBObject();
document01.put("uniqueId", "001");
document01.put("rv", "values");
document01.put("pv", "values");
final DBObject document02 = new DBObject();
document02.put("uniqueId", "002");
document02.put("rv", "values");
document02.put("pv", "values");
final DBObject document03 = new DBObject();
document03.put("uniqueId", "003");
document03.put("rv", "values");
document03.put("pv", "values");
final List<DBObject> documents = new ArrayList<DBObject>();
documents.add(document01);
documents.add(document02);
documents.add(document03);
mongoRule.getMongoService().putDocuments(documents);
assertEquals(3, mongoRule.getDatabase().getCollection("test").getCount());
}
mongoRule
データベースに接続し、提供するルールはどこにありますかMongoService
(mongoクライアントに書き込まれたラッパー)
MongoService関連のメソッド
public void putDocument(@Nonnull final DBObject document) {
LOGGER.info("inserting document - " + document.get("uniqueId"));
mongo.getDB(database).getCollectionFromFull(getCollectionName(document)).insert(document);
}
public void putDocuments(@Nonnull final List<DBObject> documents) {
for (final DBObject document : documents) {
putDocument(document);
}
}
これを実行すると、
java.lang.AssertionError:
Expected :3
Actual :1
今、私がこれを行うと
mongoRule.getMongoService().putDocuments(documents);
Thread.sleep(1000);
assertEquals(3, mongoRule.getDatabase().getCollection("contract").getCount());
エラーは表示されません。
質問:
a。)スレッドを1秒間スリープさせると、正しい数値を取得するのに役立ったのはなぜですか。並行性に関連する問題ではありませんか?2つのスレッドが同じドキュメントを配置しようとしているのに、ドキュメントは一意である必要がある場合はどうなりますか。
b。)これを修正するにはどうすればよいですか?
ありがとうございました