`
裴小星
  • 浏览: 265816 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
8ccf5db2-0d60-335f-a337-3c30d2feabdb
Java NIO翻译
浏览量:27853
F3e939f0-dc16-3d6e-8c0b-3315c810fb91
PureJS开发过程详解
浏览量:74377
07a6d496-dc19-3c71-92cf-92edb5203cef
MongoDB Java ...
浏览量:63074
社区版块
存档分类
最新评论

MongoDB Java Driver 源码分析(6):com.mongodb.DBTCPConnector

阅读更多
  DBTCPConnecror 是对 DBPort 类的封装,借助 DBPort 实现读写操作、获取服务器状态等。
say 方法和 call 方法

  DBTCPConnecror 类中比较值得分析的是 say 方法和 call 方法的实现:
// 执行写操作
WriteResult say( DB db , OutMessage m , WriteConcern concern , ServerAddress hostNeeded )
// 执行读操作
Response call( DB db , DBCollection coll , OutMessage m , ServerAddress hostNeeded , int retries )

  这两个方法的实现方式相似,实际上都是通过 DBPort 实现,同时增加了检查连接和错误处理的代码。
  这里仅以 say 方法的实现作为例子进行说明:
    public WriteResult say( DB db , OutMessage m , WriteConcern concern , ServerAddress hostNeeded )
        throws MongoException {

        // 检查数据库连接
        _checkClosed();
        checkMaster( false , true );

        // 获取数据连接端口
        MyPort mp = _myPort.get();
        DBPort port = mp.get( true , false , hostNeeded );

        try {
            // 检查权限
            port.checkAuth( db );

            // 通过 DBPort 实现写操作
            port.say( m );

            // 检查错误或返回正确的结果
            if ( concern.callGetLastError() ){
                return _checkWriteError( db , mp , port , concern );
            }
            else {
                return new WriteResult( db , port , concern );
            }
        }
        catch (...){
            // ...
        }
        finally {
            // 结束操作
            mp.done( port );
            m.doneWithMessage();
        }
    }

  say 和 call 方式是借助 DBPort  实现的,而 DBPort 对象是通过内部类 DBTCPConnector.MyPort 的 get 方法获取的:
        // 获取数据库端口
        DBPort get( boolean keep , boolean slaveOk , ServerAddress hostNeeded ){

            // 如果指定了服务器,就获取指定服务器的端口
            if ( hostNeeded != null ){
                // asked for a specific host
                return _portHolder.get(hostNeeded ).get();
            }

            // 在一个请求中,如果已经使用了一个端口,则继续使用它
            if ( _requestPort != null ){
                if ( _requestPort.getPool() == _masterPortPool || !keep ) {
                    return _requestPort;
                }

                _requestPort.getPool().done(_requestPort);
                _requestPort = null;
            }

            //  集群部署,可以从 Slave 获取端口
            if ( slaveOk && _rsStatus != null ){
                // if slaveOk, try to use a secondary
                ServerAddress slave = _rsStatus.getASecondary();
                if ( slave != null ){
                    return _portHolder.get( slave ).get();
                }
            }

            //  master 端口池为空,抛异常
            if (_masterPortPool == null) {
                throw new MongoException("Rare case where master=null, probably all servers are down");
            }

            // 通过 master 端口池获取端口
            DBPort p = _masterPortPool.get();
            if ( keep && _inRequest ) {
                _requestPort = p;
            }

            return p;
        }

其他方法

  getServerAddressList (获取服务器地址列表),checkMaster(检查 master 服务器)和 fetchMaxBsonObjectSize (获取 maxBsonObjectSize) 也有一定的分析价值:
    // 获取服务器地址列表
    public List<ServerAddress> getServerAddressList() {
        // 如果是集群方式,则通过 ReplicaSetStatus 返回地址列表
        if (_rsStatus != null) {
            return _rsStatus.getServerAddressList();
        }

        // 否则,返回 master 服务器的地址
        ServerAddress master = getAddress();
        if (master != null) {
            List<ServerAddress> list = new ArrayList<ServerAddress>();
            list.add(master);
            return list;
        }
        return null;
    }

    // 检查 master 服务器
    void checkMaster( boolean force , boolean failIfNoMaster )
        throws MongoException {
        
        // 检查是集群部署还是单机部署
        if ( _rsStatus != null ){
            if ( _masterPortPool == null || force ){

                // 集群部署
                // 通过 ReplicaSetStatus 获取 master 节点
                ReplicaSetStatus.Node n = _rsStatus.ensureMaster();
                if ( n == null ){
                    if ( failIfNoMaster )
                        throw new MongoException( "can't find a master" );
                }
                else {
                    // 根据 master 节点的信息设置 DBTCPConnector 的属性
                    _set( n._addr );
                    maxBsonObjectSize = _rsStatus.getMaxBsonObjectSize();
                }
            }
        } else {
            // 单机部署
            // 根据服务器信息设置 maxBsonObjectSize
            if (maxBsonObjectSize == 0)
                    maxBsonObjectSize = fetchMaxBsonObjectSize();
        }
    }

    // 获取并设置 maxBsonObjectSize
    int fetchMaxBsonObjectSize() {
        if (_masterPortPool == null)
            return 0;
        DBPort port = _masterPortPool.get();
        try {
            // 连接 admin 数据库,执行检查 master 服务器的命令
            CommandResult res = port.runCommand(_mongo.getDB("admin"), new BasicDBObject("isMaster", 1));
 
           // 1.8 之后的版本返回的结果中包含 maxBsonObjectSize
            if (res.containsField("maxBsonObjectSize")) {
                maxBsonObjectSize = ((Integer) res.get("maxBsonObjectSize")).intValue();
            } else {
                maxBsonObjectSize = Bytes.MAX_OBJECT_SIZE;
            }
        } catch (Exception e) {
            _logger.log(Level.WARNING, null, e);
        } finally {
            port.getPool().done(port);
        }
        return maxBsonObjectSize;
    }
4
2
分享到:
评论

相关推荐

    数据库驱动常见错误"java.lang.ClassNotFoundException:解决了jsp连接Error establishing socket.

    "java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver" 解决方案 [Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket. 解决了jsp连接 sql server 2000的问题

    MongoDB Java Driver 源码分析(1):Package 概述

    本篇文章将聚焦于MongoDB Java Driver的源码分析,首先从Package概述的角度进行深入探讨。 MongoDB Java Driver的源码主要分为以下几个核心包: 1. **com.mongodb**: 这是最顶层的包,包含了驱动的核心组件。`...

    mongodb-java-driver-4.4.0.jar

    mongodb-java-driver-4.4.0.jar

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

    标题提到的是 MongoDB 的 C# 驱动的最新版本——mongodb.driver.dll,具体为 2.12.0-beta1 版本。 MongoDB.Driver.dll 是 C# 驱动的核心组件,它包含了连接、查询、更新和操作 MongoDB 数据库所需的所有功能。这个...

    mongodb-driver-sync-4.2.3-API文档-中英对照版.zip

    标签:mongodb、driver、sync、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,...

    mongodb-driver-core-4.2.3-API文档-中文版.zip

    标签:mongodb、driver、core、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请...

    mongodb-driver-sync-4.2.3-API文档-中文版.zip

    标签:mongodb、driver、sync、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请...

    mongodb-driver-core-3.5.0.jar

    `mongodb-driver-3.5.0.jar`是完整版的MongoDB Java驱动,它扩展了`mongodb-driver-core`,提供了更高级别的操作接口,如`MongoClient`和`MongoDatabase`,方便开发者进行数据库操作。这个驱动程序使开发者能够方便...

    MongoDB Java Driver 简单操作

    ### MongoDB Java Driver 简单操作详解 #### 一、简介 MongoDB 是一款非常流行的文档型数据库系统,因其灵活性和高性能而被广泛应用于多种场景之中。为了方便开发者使用 Java 进行开发,MongoDB 提供了官方的 Java ...

    mongo-java-driver-3.12.7.jar

    mongo-java-driver-3.12.7 最新版本,java连接MongoDB最新驱动,有需要的可以自行下载

    Java连接mongoDB需要的jar包(3.9.1)

    这里提到的"Java连接mongoDB需要的jar包(3.9.1)"是指Java开发者用于连接MongoDB数据库的一组关键库文件,包括`bson-3.9.1.jar`、`mongodb-driver-3.9.1.jar`和`mongodb-driver-core-3.9.1.jar`。这些JAR文件是...

    mongo-java-driver-3.2.2.jar.zip

    MongoDB是一个流行的开源、文档型数据库系统,而`mongo-java-driver`是官方提供的Java API,允许开发者在Java应用程序中执行各种数据库操作,如读取、写入、查询等。 在本例中,我们讨论的是`mongo-java-driver`的...

    MongoDB_3.8.2驱动jar包及其同版本依赖包bson和mongodb-driver-core

    java和mongodb连接,需要mongodb-driver,您还必须下载其依赖项: bson和 mongodb-driver-core》》3个包: mongodb-driver-3.8.2.jar; bson-3.8.2.jar; mongodb-driver-core-3.8.2.jar

    MongoDB c#驱动 dll

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

    mongodb-driver-core-4.2.3-API文档-中英对照版.zip

    标签:mongodb、driver、core、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,...

    【解决方案】pyspark 初次连接mongo 时报错Class not found exception:com.mongodb.spark.sql.DefaultSource

     df = spark.read.format(com.mongodb.spark.sql.DefaultSource).load()  File /home/cisco/spark-2.2.0-bin-hadoop2.7/python/lib/pyspark.zip/pyspark/sql/readwriter.py, line 165, in load  

    mongodb-java-driver-3.5.0.jar最新驱动包

    亲测可用,解压包含三个jar包,引用时sources和doc包根据需要添加。 mongo-java-driver-3.5.0.jar; mongo-java-driver-3.5.0-javadoc.jar; mongo-java-driver-3.5.0-sources.jar;

    mongodb-async-driver-2.0.1 jar包

    MongoDB异步驱动程序(mongodb-async-driver)是为Java开发者设计的一个库,它允许应用程序以非阻塞的方式与MongoDB服务器进行通信,提高了处理大量并发请求的能力。 在"mongodb-async-driver-2.0.1.jar"这个特定...

    mongoDB java driver api

    6. **查询和过滤**:MongoDB Java驱动支持灵活的查询语法,允许你使用各种条件进行数据筛选。这包括基本的比较操作符(如$eq, $gt, $lt等)、逻辑操作符(如$and, $or)以及更复杂的聚合管道操作。 7. **索引**:...

    mongodb-java-driver源码依赖库

    10. **`com.mongodb.async.*`**:对于异步编程,MongoDB Java Driver提供了异步版本的客户端和集合操作,以配合Java 8的 CompletableFuture 或其他异步库。 了解这些核心概念后,开发者可以更有效地使用MongoDB ...

Global site tag (gtag.js) - Google Analytics