getlastError最佳实践


    1、如果没有特殊要求,最低级别也要使用WriterConcern.SAFE,即w=1。
    2、对于不重要的数据,比如log日志,可以使用WriterConcern.NONE或者WriterConcern.NORMAL,即w=-1或

    者w=0,省去等待网络的时间。
    3、对大量的不连续的数据写入,如果每次写入都调用getLastError会降低性能,因为等待网络的时间太长,

    这种情况下,可以每过N次调用一下getLastError。但是在Shard结构上,这种方式不一定确保之前的写入是

    成功的。
    4、对连续的批量写入(batchs of write),要在批量写入结束的时候调用getlastError,这不仅能确保最

    后一次写入正确,而且也能确保所有的写入都能到达服务器。如果连续写入上万条记录而不调用

    getlastError,那么不能确保在同一个TCP socket里所有的写入都成功。这在并发的情况下可能就会有问题

    。避免这个并发问题,可以参考如何在一个链接(请求)里完成批量操作,URL:java driver concurrency
    http://www.mongodb.org/display/DOCS/Java+Driver+Concurrency
    5、对数据安全要求非常高的的配置:j=true,w="majority"
    db.runCommand({getlasterror:1,j:true,w:'majority',wtimeout:10000})
    java语言可以在MongoOption中设置,MongoOption中的这些设置是全局的,对于单独的一个(连接)操作,

    还可以分别设置。 

     

    然后由于mongodb中使用连接池的原因,getLastError()需要再次从连接池中获取连接,这样效率会慢一些。可以这样做:

    db.requestStart();
    WriteResult ret = db.update({"name":"lily"},{"$set":{"age":20}});
    if(ret.getLastError() == null)
    return true;
    else
    return false;
    db.requestDone();

    就可以保证update操作和getLastError()使用同一个连接,并且减少了一次存/取连接的过程。