在恰当的地方使用MongoDB的WriteConcern.SAFE参数
引自http://www.cnblogs.com/xinghebuluo/archive/2011/12/01/2270896.html
首先列一下WriteConcern的几种抛出异常的级别参数:
WriteConcern.NONE:没有异常抛出WriteConcern.NORMAL:仅抛出网络错误异常,没有服务器错误异常WriteConcern.SAFE:抛出网络错误异常、服务器错误异常;并等待服务器完成写操作。WriteConcern.MAJORITY: 抛出网络错误异常、服务器错误异常;并等待一个主服务器完成写操作。WriteConcern.FSYNC_SAFE: 抛出网络错误异常、服务器错误异常;写操作等待服务器将数据刷新到磁盘。WriteConcern.JOURNAL_SAFE:抛出网络错误异常、服务器错误异常;写操作等待服务器提交到磁盘的日志文件。WriteConcern.REPLICAS_SAFE:抛出网络错误异常、服务器错误异常;等待至少2台服务器完成写操作。?
当我们执行如下操作时(将"name"为"lily"的"age"设置为20):
WriteResult ret = db.update({"name":"lily"},{"$set":{"age":20}});if(ret.getN()>0) //操作影响的对象个数 return true;else return false;或者:
WriteResult ret = db.update({"name":"lily"},{"$set":{"age":20}});if(ret.getLastError() == null) return true;else return false;此时,getLastError()会查询上次操作结果是否出现错误。
更进一步
然后由于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()使用同一个连接,并且减少了一次存/取连接的过程。
?
还有一个方法
此时也可以使用WriteConcern.SAFE参数:
WriteResult ret = db.update({"name":"lily"},{"$set":{"age":20}}, WriteConcern.SAFE);if(ret.getLastError() == null) return true;else return false;// is equivalent to db.requestStart();WriteResult ret = db.update({"name":"lily"},{"$set":{"age":20}});if(ret.getLastError() == null) return true;else return false;db.requestDone();这也是我推荐使用的方式,这样即可以高效的得到返回结果,还能感知到服务器错误,一举两得。