`
kfcman
  • 浏览: 397033 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

在恰当的地方使用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();

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

 

分享到:
评论

相关推荐

    mongodb.dll 下载.zip

    `mongodb.dll`是MongoDB数据库系统在Windows平台上运行所必需的一个动态链接库(DLL)文件,它包含了MongoDB客户端和服务器所需的关键功能。 在Windows操作系统中,`.dll`文件是一种共享库,用于存储程序执行时需要...

    mongodb c#驱动最新驱动mongodb.driver.dll 版本2.12.0-beta1

    开发者在升级到此版本时,需要注意其预发布(beta)状态,这意味着可能存在不稳定因素,建议在生产环境使用前充分测试。 MongoDB.Bson.dll 文件是 Bson(Binary JSON)的实现,Bson 是一种二进制形式的 JSON,它...

    Mastering MongoDB 4.x, 2nd Edition

    Master the new features and capabilities of MongoDB 4.x Implement advanced data modeling, querying, and administration techniques in MongoDB Includes rich case-studies and best practices followed ...

    Mastering MongoDB 3.x

    Mastering MongoDB 3.x: An expert’s guide to building fault-tolerant MongoDB applications MongoDB has grown to become the de facto NoSQL database with millions of users—from small startups to Fortune...

    Mastering MongoDB 4.x - Second Edition.pdf

    在学习《Mastering MongoDB 4.x - Second Edition》这本书的过程中,读者不仅能够获得MongoDB的核心知识和技能,也能够收获一些进阶知识,例如,如何通过搭建索引来优化查询性能,如何利用聚合框架进行复杂的数据...

    基于Django的Web日志分析可视化系统python+css源码(ECharts+MongoDB).zip

    1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,...

    大数据实战项目商品推荐系统源码+项目说明(Spark、Scala、MongoDB).zip

    大数据实战项目商品推荐系统源码+项目说明(Spark、Scala、MongoDB).zip大数据实战项目商品推荐系统源码+项目说明(Spark、Scala、MongoDB).zip大数据实战项目商品推荐系统源码+项目说明(Spark、Scala、MongoDB)...

    mongoDB使用.go

    mongoDB使用.gomongoDB使用.gomongoDB使用.go

    MongoDB入门.pdf

    - **配置PHP**:在php.ini文件中启用MongoDB扩展,添加`extension=mongodb.so`。 - **使用扩展**:通过`\MongoDB\Client`类实例化MongoDB客户端,执行数据库操作。 ### 总结 MongoDB作为一款强大的NoSQL数据库,...

    MongoDB c#驱动 dll

    MongoDB.Driver.dll构建在MongoDB.Driver.Core.dll之上,提供了一套更高级别的、易于使用的接口。 在C#中使用这些DLL,开发者首先需要安装MongoDB.CSharpDriver NuGet包,这将自动引入所有必需的依赖。然后,可以...

    Mastering MongoDB 4.x - Second Edition - Alex Giamas(2019)

    Mastering MongoDB 4.x - Second Edition - Alex Giamas(2019),MongDB优秀英文参考书籍,epub格式,欢迎下载

    MongoDb db.createUser用户权限

    MongoDB 3.6 之后,建议使用 `createUser` 的 `pwd` 参数配合 ` scram-sha-256` 认证机制。 - `customData`: 可选参数,可以存储关于用户的一些自定义信息。 - `roles`: 必填参数,指定用户的角色。角色决定了用户对...

    MongoDBDemo.rar

    1. **安装MongoDB驱动**:为了在C#中与MongoDB交互,我们需要先安装MongoDB的C#驱动程序,通常通过NuGet包管理器进行安装,包名是`MongoDB.Driver`。 2. **连接配置**:连接到MongoDB服务器时,需要提供主机名(或...

    mongodb3.0.5.tgz

    MongoDB是一款开源、分布式、高性能的NoSQL数据库,它的出现为大数据时代的数据存储与处理提供了新的解决方案。在Linux环境中,尤其是...了解并掌握这些知识点,将有助于你在使用MongoDB时更好地管理和保护你的数据。

    mongodb配置.rar

    在“mongodb配置.rar”这个压缩包中,包含了三个关键文件,它们是“mongodb.conf”配置文件、“stop.sh”停止脚本和“run.sh”启动脚本,这些都是MongoDB在Linux环境下部署和管理时常见的文件。 首先,我们来看...

    11.2.4 在哪些场景使用MongoDB?.md

    11.2.4 在哪些场景使用MongoDB?

    mongodb3.4.12.tar.gz

    - MongoDB官方网站(https://www.mongodb.com/download-center/community)是获取最新版本的官方渠道。你可以在这里选择你需要的版本,比如3.4.12,下载对应的Linux二进制文件`mongodb-linux-x86_64-3.4.12.tgz`。 ...

    mongodb教程.zip

    mongodb教程.zip

    mongodb源码.zip

    mongodb源码.zip

Global site tag (gtag.js) - Google Analytics