在恰当的地方使用MongoDB的WriteConcern.SAFE参数
首先列一下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参数相关推荐
- Spirng中Mongodb中write-concern的解释
Spring在插入数据库时没有返回状态配置:write-concern获取异常<beans xmlns="http://www.springframework.org/schema/b ...
- mongodb配置文件启动linux,Linux运维知识之Mongodb启动方法:设定参数启动;从设置文件启动...
本文主要向大家介绍了Linux运维知识之Mongodb启动方法:设定参数启动;从设置文件启动,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助. 接手的MongoDB只有一个日志文件 ...
- 如何搜索旅行的好地方(MongoDb LINQ和.NET Core)
目录 涵盖的主题 安装 MongoDB配置 MongoImport –使用大型数据集初始化数据库 MongoDB – LINQ支持 如何在特定城市中找到要做的事情 运行更快的查询 组项目 接下来 让我 ...
- MongoDB简单学习小总结
MongoDB学习 背景:互联网发展开始只有少量的数据,一台服务器足够,使用的时候得进行数据备份以应对大量的读取和宕机.之后添加缓存层,提升查询速度. MongoDB具有二级索引.范围查询.排序.聚合 ...
- MongoDB一篇从入门到实战
目录 MongoDB 数据库介绍 01.MongoDB简介 1.性能高 2.支持分布式 3.安装和部署容易 4.便于开发 5.NOSQL与SQL对比 02.文档存储结构 1.键值对 2.文档 3.集合 ...
- 论:MongoDB的好坏丑
对刚刚接触 MongoDB 的人来说, MongoDB就是一个NoSQL类型的文档数据库. 文档中包含的键值对,构成了MongoDB的数据基本单位. 不过可以肯定的是MongoDB的确是当前最流行的N ...
- php mongodb execute,php简单操作mongodb
您现在的位置是:网站首页>>PHP>>php php简单操作mongodb 发布时间:2019-09-29 16:34:25作者:wangjian浏览量:525点赞量:0 一: ...
- MongoDB for PHP扩展操作类
<?php /** * * @link https://github.com/thendfeel/TmongoDB * @example * @copyright * @site ...
- 深度解读 MongoDB 4.4 新特性
简介:随着计算和数据上云的趋势愈发明显,传统数据库"步履蹒跚",云数据库将是未来.本次直播,阿里云将隆重发布2款全新升级产品--云数据库 MongoDB 4.4 和MongoDB ...
最新文章
- Java并发基础:了解无锁CAS就从源码分析
- 路径名导致的异常:javax.imageio.IIOException: Can‘t read input file!
- 当前分支上有未提交的更改时签出另一个分支
- Ubuntu16.04 换阿里源
- java定义一个学生类cstudent_编写一个JAVA程序片断 定义一个表示学生的类student
- E-SKILL网络工程师考试认证必备
- 你的ABAP程序给佛祖开过光么?来试试Jerry这个小技巧
- 今天pycharm不能正常使用了
- 让其他CMS黯然失色的we7CMS
- 计算机曝光模式有哪些,摄影:单反相机中P、A、S、M四种曝光模式的用法详解 -电脑资料...
- 小米改鸿蒙系统,小米、OV傻眼 魅族要用鸿蒙系统!
- 【二分法】计蒜客:对数方程
- TFC2017 腾讯Web前端大会参会小结
- Blackman 窗函数
- mt2503短信數量和定義的不一致
- 巴斯勒相机的ip掩码_basler调相机规范步骤
- 毕设:基于CNN卷积神经网络的猫狗识别、狗品种识别(Tensorflow、Keras、Kaggle竞赛)
- 1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE
- git免密pull指定ssh密钥文件
- 2020-03-18HTML