WriteConcern的几种抛出异常的级别参数:
- WriteConcern.NONE:没有异常抛出
- WriteConcern.NORMAL:仅抛出网络错误异常,没有服务器错误异常
- WriteConcern.SAFE:抛出网络错误异常、服务器错误异常;并等待服务器完成写操作。
- WriteConcern.MAJORITY: 抛出网络错误异常、服务器错误异常;并等待一个主服务器完成写操作。
- WriteConcern.FSYNC_SAFE: 抛出网络错误异常、服务器错误异常;写操作等待服务器将数据刷新到磁盘。
- WriteConcern.JOURNAL_SAFE:抛出网络错误异常、服务器错误异常;写操作等待服务器提交到磁盘的日志文件。
- WriteConcern.REPLICAS_SAFE:抛出网络错误异常、服务器错误异常;等待至少2台服务器完成写操作。
但是每个级别都有自己的作用,现在自己举个列子:
默认情况下,该操作会使用WriteConcern.NORMAL(仅在网络错误时抛出异常),等同于:
db.update({"name":"lily"},{"$set":{"age":20}})
db.update({"name":"lily"},{"$set":{"age":20}},WriteConcern.NORMAL)
这两个更新语句是相同的。
使用NORMAL模式参数,可以使得写操作效率非常高。但是如果此时服务器出错,也不会返回错误给客户端,而客户端会误认为操作成功。
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();
此时也可以使用WriteConcern.SAFE参数:
WriteResult ret = db.update({"name":"lily"},{"$set":{"age":20}}, WriteConcern.SAFE); if(ret.getLastError() == null) return true; else return false;