首先列一下WriteConcern的几种抛出异常的级别参数:

  • WriteConcern.NONE:没有异常抛出
  • WriteConcern.NORMAL:仅抛出网络错误异常,没有服务器错误异常
  • WriteConcern.SAFE:抛出网络错误异常、服务器错误异常;并等待服务器完成写操作。
  • WriteConcern.MAJORITY: 抛出网络错误异常、服务器错误异常;并等待一个主服务器完成写操作。
  • WriteConcern.FSYNC_SAFE: 抛出网络错误异常、服务器错误异常;写操作等待服务器将数据刷新到磁盘。
  • WriteConcern.JOURNAL_SAFE:抛出网络错误异常、服务器错误异常;写操作等待服务器提交到磁盘的日志文件。
  • WriteConcern.REPLICAS_SAFE:抛出网络错误异常、服务器错误异常;等待至少2台服务器完成写操作。

当我们执行如下操作时(将"name"为"lily"的"age"设置为20):

db.update({"name":"lily"},{"$set":{"age":20}})

默认情况下,该操作会使用WriteConcern.NORMAL(仅在网络错误时抛出异常),等同于:

db.update({"name":"lily"},{"$set":{"age":20}},WriteConcern.NORMAL)

使用NORMAL模式参数,可以使得写操作效率非常高。但是如果此时服务器出错,也不会返回错误给客户端,而客户端会误认为操作成功。

因此在很多重要写操作中需要使用WriteConcern.SAFE模式,保证可以感知到这个错误,保证客户端和服务器对一次操作的正确性认知保持一致。

(根据笔者测试,如果服务器发生掉电情况,客户端依然得不到当时操作的错误返回,需要特别注意)

另外在很多时候,我们需要确切知道这次写操作是否成功(或者本次更新操作影响了多少个对象),这时候就需要:

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();

这也是我推荐使用的方式,这样即可以高效的得到返回结果,还能感知到服务器错误,一举两得。

转载于:https://www.cnblogs.com/xinghebuluo/archive/2011/12/01/2270896.html

在恰当的地方使用MongoDB的WriteConcern.SAFE参数相关推荐

  1. Spirng中Mongodb中write-concern的解释

    Spring在插入数据库时没有返回状态配置:write-concern获取异常<beans xmlns="http://www.springframework.org/schema/b ...

  2. mongodb配置文件启动linux,Linux运维知识之Mongodb启动方法:设定参数启动;从设置文件启动...

    本文主要向大家介绍了Linux运维知识之Mongodb启动方法:设定参数启动;从设置文件启动,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助. 接手的MongoDB只有一个日志文件 ...

  3. 如何搜索旅行的好地方(MongoDb LINQ和.NET Core)

    目录 涵盖的主题 安装 MongoDB配置 MongoImport –使用大型数据集初始化数据库 MongoDB – LINQ支持 如何在特定城市中找到要做的事情 运行更快的查询 组项目 接下来 让我 ...

  4. MongoDB简单学习小总结

    MongoDB学习 背景:互联网发展开始只有少量的数据,一台服务器足够,使用的时候得进行数据备份以应对大量的读取和宕机.之后添加缓存层,提升查询速度. MongoDB具有二级索引.范围查询.排序.聚合 ...

  5. MongoDB一篇从入门到实战

    目录 MongoDB 数据库介绍 01.MongoDB简介 1.性能高 2.支持分布式 3.安装和部署容易 4.便于开发 5.NOSQL与SQL对比 02.文档存储结构 1.键值对 2.文档 3.集合 ...

  6. 论:MongoDB的好坏丑

    对刚刚接触 MongoDB 的人来说, MongoDB就是一个NoSQL类型的文档数据库. 文档中包含的键值对,构成了MongoDB的数据基本单位. 不过可以肯定的是MongoDB的确是当前最流行的N ...

  7. php mongodb execute,php简单操作mongodb

    您现在的位置是:网站首页>>PHP>>php php简单操作mongodb 发布时间:2019-09-29 16:34:25作者:wangjian浏览量:525点赞量:0 一: ...

  8. MongoDB for PHP扩展操作类

    <?php /** * * @link        https://github.com/thendfeel/TmongoDB * @example * @copyright * @site  ...

  9. 深度解读 MongoDB 4.4 新特性

    简介:随着计算和数据上云的趋势愈发明显,传统数据库"步履蹒跚",云数据库将是未来.本次直播,阿里云将隆重发布2款全新升级产品--云数据库 MongoDB 4.4 和MongoDB ...

最新文章

  1. Java并发基础:了解无锁CAS就从源码分析
  2. 路径名导致的异常:javax.imageio.IIOException: Can‘t read input file!
  3. 当前分支上有未提交的更改时签出另一个分支
  4. Ubuntu16.04 换阿里源
  5. java定义一个学生类cstudent_编写一个JAVA程序片断 定义一个表示学生的类student
  6. E-SKILL网络工程师考试认证必备
  7. 你的ABAP程序给佛祖开过光么?来试试Jerry这个小技巧
  8. 今天pycharm不能正常使用了
  9. 让其他CMS黯然失色的we7CMS
  10. 计算机曝光模式有哪些,摄影:单反相机中P、A、S、M四种曝光模式的用法详解 -电脑资料...
  11. 小米改鸿蒙系统,小米、OV傻眼 魅族要用鸿蒙系统!
  12. 【二分法】计蒜客:对数方程
  13. TFC2017 腾讯Web前端大会参会小结
  14. Blackman 窗函数
  15. mt2503短信數量和定義的不一致
  16. 巴斯勒相机的ip掩码_basler调相机规范步骤
  17. 毕设:基于CNN卷积神经网络的猫狗识别、狗品种识别(Tensorflow、Keras、Kaggle竞赛)
  18. 1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE
  19. git免密pull指定ssh密钥文件
  20. 2020-03-18HTML

热门文章

  1. 【1】生产者-消费者模型的三种实现方式
  2. volatile理解了吗?
  3. 驱动思想之机制和策略
  4. vue 多选自动触发_Vue,初次邂逅(二)
  5. Tomcat设置URL兼容特殊符号
  6. 第8章-常用优先级和css3
  7. main.js中封装全局登录函数
  8. 9、Flutter 实现 生成二维码
  9. 微信支付 签名算法 sign node实现
  10. numpy将所有数据变为0和1_Numpy库学习