我正在尝试使用mongo 1.8.0模拟mongo写锁定,但无法看到正确的预期结果。
我在同一台服务器上的两个不同的dbs中创建了两个mongo集合。我创建了一个DBObject数组并将它们插入到两个集合中。使用两个线程同时触发批量插入。我还跟踪调用DBCollection.insert(DBObject arr,WriteConcern.SAFE)之前和之后的时间。
尽管使用了不同的对象大小和数组大小,我总是发现插入两个DB所需的时间有点接近。我希望一个线程首先写入阻塞另一个线程,导致两个线程之间的时间明显不同。我在这里找不到什么东西吗?
class BenchTest {
public static void main() {
Mongo m = new Mongo(host,port);
DBCollection coll1 = m.getDB("db0").getColl("coll0");
DBCollection coll2 = m.getDB("db1").getColl("coll0");
Thread t1 = new WriteThread();
t1.setCollection(coll1);
Thread t2 = new WriteThread();
t2.setCollection(coll2);
t1.run();
t2.run();
}
}
class WriteThread extends Thread {
DBCollection coll;
public void setCollection (DBCollection coll) {
this.coll = coll;
}
long startTime = System.currentTimeMillis();
coll.insert( (DBObject1, DBObject2, …, DBObjectn), WriteConcern.SAFE);
long endTime = System.currentTimeMillis();
System.out.println ("Time taken = "+(endTime-startTime));
}
答案 0 :(得分:2)
为什么不使用fsync & lock来模拟"写锁定"?
很难模拟"写锁定"因为它基本上不会闲逛,所以只有很短的时间。版本(1.8,2.0和2.2)中列出了here的许多变化(以免重复我自己)。
对于某人来说,这是一个非常好的blog post - 其他人在"写锁定"上做了类似的测试。