`
QING____
  • 浏览: 2253450 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Mongodb客户端原理

 
阅读更多

    JAVA客户端原理简述

    mongodb提供了官方的JAVA客户端,在上文中我们已经看到了示例。

    接下来我们简单的阐述一下它的基本原理:

    1)MongoClient参数列表中,允许指定多个mongod的addresses,注意,它们要么是同一个replica set中所有memebers列表,要么为同一个cluster的mongos列表,且不能混合使用。

    mongodb提供了2种架构模式:replica set和sharded cluster,其中replica set中多个member存储的数据一样,一个MongoClient只能允许与一个replica set通讯,它的所有members(必须为可以提供read、write操作的members)均需要传入MongoClient;对于shared cluster,通常会部署多个mongos,mongos是客户端与集群数据节点(shards节点)通讯的桥梁,因此MongoClient中可以指定多个mongos地址。

    其中addresses的顺序并不重要。

 

    2)如果指定的addresses为列表,那么MongoClient内部将构造一个MultiServerCluster实例;如果addresses为单个地址,则创建一个SingleServerCluster。

    其中MultiServerCluster内部维护一个map,Key为ServerAddress,Value为一个ClusterableServer实例;ClusterableServer接口的默认实现类为DefaultServer,它内部维护一个ConnectionPool,我们可以在创建MongoClient时指定MongoClientOptions,用于设定连接池的大小和其他一些参数(包括Socket参数、read preference、write concern等)。(参见源码:ConnectionSource,Mongo)

 

    3)对于replica set模式而言,MongoClient将同时与所有的members建立链接;其中write操作通过与primary节点建立的connection进行交互,但是对于read操作则需要调整,因为开发者可以为每个find()操作指定“read preference”(或者默认的),每个read操作都会从Server列表中根据“read perference”类型选择合适的Server(如果有多个,则最终随机选择其中一个),并将此server与操作binding,直到操作结束;如果read操作中使用了cursor,那么在cursor的整个遍历过程中,均会使用此前binding的server,不会更换server,但是因为内部ConnectionPool的机制,可能在整个Cursor遍历期间,多次IO会使用连接池中的不同的connection,不过这不会对操作带来任何问题。(参见源码:ClusterBinding,ReadPreferenceServerSelector,MongoCursor)

 

    4)对于sharded cluster而言,情况或许相对简单;因为每个mongos都可以接收read、write请求,客户端的每个操作都会从Server列表随机选择一个Server实例,然后从Server实例的连接池中获取Connection对象即可。对于Cursor问题,同3),即Cursor遍历期间,所有的IO均与一个Server通讯。

 

    5)MongoClient内置Server状态监测机制,每个Server都会初始化一个监控线程,此线程间歇性的与server地址建立链接,如果链接失败,则认为此Server,将会尝试从Server列表中移除(同时关闭其连接池中的链接);此后如果某刻,此Server再次有效,那么再次将它添加到Server列表中。

    在MongoClientOptions中可以通过“heartbeatFrequency”参数指定监测的周期(参见源码:DefaultServerMonitor,ChangeListener)

 

List<ServerAddress> replicaSet = new ArrayList<ServerAddress>();
replicaSet.add(new ServerAddress("127.0.0.1",27017));
replicaSet.add(new ServerAddress("127.0.0.1",28017));
replicaSet.add(new ServerAddress("127.0.0.1",29017));//replica set
MongoClientOptions options = MongoClientOptions.builder().writeConcern(WriteConcern.MAJORITY)
        .connectTimeout(30000)
        .connectionsPerHost(128)
        .heartbeatConnectTimeout(15000)
        .heartbeatFrequency(10000)
        .maxConnectionIdleTime(60000)
        .maxWaitTime(10000).build();
MongoClient mongoClient = new MongoClient(replicaSet,options);
MongoDatabase db = mongoClient.getDatabase("test");
MongoCollection<Document> collection = db.getCollection("user");
MongoCursor<Document> cursor = collection.find(Filters.eq("name", "zhangsan")).batchSize(32)
        .skip(200)
        .limit(32).iterator();
while (cursor.hasNext()) {
    Document item = cursor.next();
    System.out.println(item.toJson());
}
cursor.close();//must be
mongoClient.close();

 

分享到:
评论

相关推荐

    MongoDB客户端访问(Shell方式 ) .pdf

    MongoDB 是一个流行的开源文档型数据库系统,它使用JSON格式的数据模型,支持分布式存储,并且提供了丰富的查询语言...同时,实践是提升技能的关键,通过实际操作MongoDB Shell,可以更好地理解其工作原理和使用技巧。

    MongoDB原理与实战-阿里云-张友东

    ### MongoDB原理与实战核心知识点概览 #### 一、MongoDB复制集原理 **1.1 MongoDB复制集介绍** - **定义**: MongoDB复制集是一种高可用性和容错性方案,它由一个或多个副本组成,每个副本都是主数据库的一个完整...

    mongodb-csfle-csharp-demo:这是Adrienne Tacke在C#教程中使用C#编写的MongoDB客户端字段级加密(CSFLE)中创建的示例应用程序。

    MongoDB 客户端字段级加密(CSFLE,Client-Side Field Level Encryption)是一种强大的安全特性,允许数据在客户端加密后存储到数据库,而无需在服务器端暴露明文。Adrienne Tacke 提供的这个 `mongodb-csfle-csharp...

    深入云计算 MongoDB管理与开发实战详解pdf.part1

    3.5 客户端请求和MongoDB数据库连接 3.6 本章小结 第2篇 应用篇 第4章 查询 4.1 find简介 4.1.1 返回指定的键 4.1.2 find查询限制 4.2 条件操作符 4.2.1 $all匹配所有 4.2.2 $exists判断字段...

    实验五 MongoDB分片部署与启动

    1. **启动分片功能**:在服务器nosql01中登录mongos的MongoDB客户端,切换到数据库`gateway`,并向分片集群中添加三个Shard,分别为`shard1`、`shard2`和`shard3`。 #### 实验注意事项 - 在实验过程中,需要注意...

    MongoDB Sharding 机制分析

    3. 透明的使用接口:MongoDB 的 Sharding 对客户端提供了透明的使用接口,大部分功能可用,基本不需要更改任何代码。 4. 高可扩展性:MongoDB 的 Sharding 节点是无状态的,可以任意水平扩展。 因此,MongoDB 的 ...

    mongodb-5.0.6

    源码分析对于理解 MongoDB 内部工作原理、学习数据库系统设计、甚至参与贡献开源项目都是十分有益的。 MongoDB 的核心组件包括: 1. **Mongod**:这是 MongoDB 的主要进程,负责数据存储、查询处理和复制。在...

    mongodb-java-driver源码依赖库

    1. **`com.mongodb.client.MongoClients`**:这是创建MongoDB客户端连接的主要入口点。它提供了一个静态方法`create()`,用于根据提供的连接字符串或其他配置创建`MongoClient`实例。 2. **`...

    mongojs:MongoDB Websockets 客户端

    MongoJS是基于JavaScript的一种轻量级的MongoDB客户端库,专为通过WebSockets与MongoDB数据库进行交互而设计。这个库允许Web应用程序直接在浏览器中执行常见的MongoDB操作,如增、删、改、查,从而实现了客户端与...

    mongodb3.1.3的源码

    MongoDB的网络层负责客户端连接、请求处理和响应发送。源码揭示了如何使用libmongoclient进行TCP/IP通信,以及如何实现异步I/O模型,如事件驱动的libev或libevent库。 4. **BSON数据格式**: BSON是二进制JSON的...

    深入剖析 MongoDB 架构

    本文将深入剖析 MongoDB 的架构,帮助你更好地理解其工作原理。 首先,我们来了解一下 MongoDB 的基本架构。MongoDB 采用的是主从复制(Replica Sets)和分片(Sharding)两种方式来实现高可用性和水平扩展。主从...

    mongodb,delphi xe3

    MongoDB C驱动是开源的,它提供了基础的客户端功能,如连接到MongoDB服务器、执行查询、插入和更新文档等。开发者可以将其编译为适用于不同平台的库,并在Delphi XE3中使用。 在使用Delphi XE3与MongoDB集成时,...

    高可用mongodb集群搭建

    完成所有组件的启动后,我们可以使用MongoDB自带的命令行工具或第三方客户端工具进行测试,确保集群能够正常工作。 通过以上步骤,我们就完成了MongoDB高可用集群的搭建。在整个过程中,需要注意的是确保所有组件...

    MongoDB权威指南 中文版

    ### MongoDB权威指南知识点总结 #### 一、MongoDB概述 - **定义与特点**:MongoDB是一种基于分布式文件...通过学习本书,读者可以深入了解MongoDB的工作原理,并掌握如何有效地利用MongoDB来构建高性能的应用程序。

    mongodb源码

    MongoDB使用自定义的网络协议处理客户端请求,这个协议基于TCP/IP。源码中的`src/mongo/transport`目录包含了与网络通信相关的代码。 8. **索引**: MongoDB支持多种类型的索引,如单键索引、复合索引、地理空间...

    MONGODB学习总结入门篇.pdf

    下面将对MongoDB的基本概念、特点、使用原理和基本操作进行详细介绍。 1. MongoDB基本概念 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富, 最像关系数据库的。他支持的...

    mongodb-src-r2.4.12

    3. **网络架构**:MongoDB采用基于事件的异步网络模型,如libev或libevent,处理客户端的连接和请求。理解网络层的工作原理有助于优化服务器性能。 4. **查询解析与执行**:MongoDB的查询语言MQL(Mongo Query ...

    mongodb-csharp

    在C#中,为了连接和操作 MongoDB,我们需要使用 MongoDB .NET 客户端驱动。这个驱动程序允许开发人员通过 C# 代码与 MongoDB 服务器进行通信,执行增删查改等操作。MongoDB .NET 驱动通常包含以下关键组件: 1. **...

    MongoDB C Driver 1.13.0 64 release

    - **libmongoc**: 这是核心的客户端库,实现了MongoDB协议,包括连接管理、认证、命令执行等功能。 - **libbson**: 这是一个轻量级的二进制JSON序列化/反序列化库,用于处理MongoDB中的BSON文档。 - **Build ...

    vs2005的mongodb驱动

    标题中提到的"vs2005的mongodb驱动"是指为VS2005设计的MongoDB客户端库,它允许开发者在C#环境中与MongoDB服务器进行通信。尽管VS2005相对较旧,但它仍可通过NuGet包管理器或手动下载安装驱动程序来支持现代的数据库...

Global site tag (gtag.js) - Google Analytics