• mongoDB研究笔记:写关注


    对于某些应用程序来说,写关注是重要的。它能判断哪些写操作成功写入了,哪些失败了,对于失败的操作,驱动程序能返回错误,由应用程序决定怎么处理。如果没有写关注,应用程序发送一个写操作到socket后,就不会管后面发送了什么情况,不知道是否成功写入数据库,这种情形对于日志类型的应用程序还是可以接受的,因为偶尔的写失败不会影响整个日志的监控情况;带有写关注的操作会等到数据库确认成功写入后才能返回,因此写关注会带来一点性能的损失。下面先分析复制集上写关注配置。

    默认情况下复制集的写关注只针对primary节点,当应用程序发送一个写操作请求时,驱动程序会调用getLastError命令返回写操作的执行情况(这一动作对应用程序来说是透明的),getLastError命令会根据你配置的写关注选项来执行。写关注选项的配置是针对当前客户端与数据库的socket连接来说的,因此配置项需要通过应用程序传递给驱动程序。当然如果你没有传递任何选项参数给驱动程序,getLastError命令会根据你配置在复制集中默认配置local.system.replset.settings.getLastErrorDefaults执行。getLastError命令的常用选项如下:

    (1) 选项w

    当取值为-1时,驱动程序不会使用写关注,忽略掉所有的网络或socket错误。

    当取值为0时,驱动程序不会使用写关注,只返回网络和socket的错误。

    当取值为1时,驱动程序使用写关注,但是只针对primary节点,这个配置项是复制集或单mongod实例的默认写关注配置。

    当取值为整数且大于1时,写关注将针对复制集中n个节点,当客户端收到这些节点的反馈信息后,命令才返回给客户端继续执行。

    (2)选项wtimeout

    指定写关注应在多长时间内返回,如果你没有指定这个值,复制集可能因为不确定因素导致应用程序的写操作一直阻塞。

    下面通过一段代码对上面的描述做个回顾,在C#驱动程序下连接复制集并插入一条记录。

    //实例化一个客户端的连接属性实例

    MongoClientSettings clientSetting = new MongoClientSettings();

    //设置属性准备Servers为要连接的复制集中的所有成员实例

    List<MongoServerAddress> Servers = new List<MongoServerAddress>();

    Servers.Add(new MongoServerAddress("Guo",40000));

    Servers.Add(new MongoServerAddress("Guo",40001));

    Servers.Add(new MongoServerAddress("Guo",40002));

    clientSetting.Servers = Servers;

    clientSetting.ReplicaSetName = "rs0"; //设置属性复制集的名称

    MongoClient client = new MongoClient(clientSetting);//根据设置的属性,实例化客户端

    //得到一个与复制集连接的实例

    MongoServer server = client.GetServer();

    //获得一个与具体数据库连接对象,数据库名为students

    MongoDatabase mydb = server.GetDatabase("students");

    //获得数据库中的表对象,即scores表

    MongoCollection mydbTable = mydb.GetCollection("scores");

    //准备一条数据,即声明一个文档对象

    BsonDocument doc = new BsonDocument

    {

    {"stuid",5},

    {"subject","sports"},

    {"score",99}

    };

    //将文档插入到数据库中

    mydbTable.Insert(doc);

    上面代码向复制集中插入一条数据,但是客户端的配置属性都是默认的,写关注w选项值为1,可以在C#的驱动程序中通过MongoClientSettings这个类来设置客户端的连接属性,包括写关注等;上面的代码也没有具体指定连接到哪个节点,但驱动程序会默认的选择primary节点;当primary节点宕机时,复制集重新选择出新的primary节点,驱动程序尝试重新连接新的primary节点并完成插入,这个动作对应用程序透明的。

  • 相关阅读:
    VMware 安装Windows Server 2008 R2
    Linux系统常用命令
    VMware安装CentOS 7和kali 2019.03
    Windows系统下常用命令
    javaFx 图书管理系统,采用 jfoenix-8.0.4 开源框架,使用 MaterialDesighn 风格
    华中大数据结构课程设计-------基于查找表的单词检索软件--------静态表、动态表、哈希表
    Java语言程序设计 :医院简易挂号管理系统 华科Java实验
    java 通过TCPUDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端
    JAVA 通过 Socket 实现 TCP 编程
    app自动化测试python
  • 原文地址:https://www.cnblogs.com/guoyuanwei/p/3535252.html
Copyright © 2020-2023  润新知