我正在尝试使用mongo 1.8.0模拟mongo写锁,但无法看到正确的预期结果。

我在同一台服务器上的两个不同数据库中创建了两个mongo集合。我创建了一个DBObjects数组,并将它们插入两个集合中。批处理插入使用两个线程同时触发。我还跟踪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));

}

最佳答案

为什么不只使用fsync & lock模拟“写锁”?

由于“写锁”基本上不会挂在那儿,因此很难模拟,因为它只存在一小段时间。 here中概述了跨版本(1.8、2.0和2.2)的许多更改(以免重复我自己)。

这是对某人的一个非常好的blog post,对“写锁”进行了类似的测试。

10-06 09:19