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

MongoDB Java Driver 源码分析(9):com.mongodb.DBport

阅读更多
  DBPort 是表示数据库端口的类,分别用 call 和 say 方法实现读取和写入操作。
  这两个方法都调用了 go 方法。
    // 读取操作
    Response call( OutMessage msg , DBCollection coll )
        throws IOException {
        return go( msg , coll );
    }

    // 写入操作
    void say( OutMessage msg )
        throws IOException {
        go( msg , null );
    }

    // 执行操作
    private synchronized Response go( OutMessage msg , DBCollection coll )
        throws IOException {
        return go( msg , coll , false );
    }

    // 执行操作
    private synchronized Response go( OutMessage msg , DBCollection coll , boolean forceReponse )
        throws IOException {

        // 正在处理请求
        if ( _processingResponse ){
            if ( coll == null ){
                // this could be a pipeline and should be safe
            }
            else {
                // this could cause issues since we're reading data off the wire
                throw new IllegalStateException( "DBPort.go called and expecting a response while processing another response" );
            }
        }

        // 增加调用次数计数
        _calls++;
    
        // _sorket 为空,打开连接
        if ( _socket == null )
            _open();
        
        if ( _out == null )
            throw new IllegalStateException( "_out shouldn't be null" );

        try {
            // 准备消息
            msg.prepare();

            // 输出
            msg.pipe( _out );
            
            if ( _pool != null )
                _pool._everWorked = true;
            
            if ( coll == null && ! forceReponse )
                return null;
            
            _processingResponse = true;

            // 返回结果
            return new Response( _sa , coll , _in , _decoder);
        }
        catch ( IOException ioe ){
            close();
            throw ioe;
        }
        finally {
            _processingResponse = false;
        }
    }

  DBProt 的 go 方法调用了 OutMessage 的 prepare、pipe 等方法,实际上这些方法又是间接地通过 PoolOutputBuffer 实现的,这将在后面的文章中提到。

  另外 DBPort 的 open 方法用于打开数据连接:
    // 打开连接
    boolean _open()
        throws IOException {
        
        long sleepTime = 100;

        final long start = System.currentTimeMillis();
        while ( true ){
            
            IOException lastError = null;

            try {
                // 创建 socket 并连接
                _socket = new Socket();
                _socket.connect( _addr , _options.connectTimeout );
                
                // 设置 socket 参数
                _socket.setTcpNoDelay( ! USE_NAGLE );
                _socket.setKeepAlive( _options.socketKeepAlive );
                _socket.setSoTimeout( _options.socketTimeout );

                // 获取输入输出流
                _in = new BufferedInputStream( _socket.getInputStream() );
                _out = _socket.getOutputStream();
                return true;
            }
            catch ( IOException ioe ){
               // ...
            }
            
            if ( ! _options.autoConnectRetry || ( _pool != null && ! _pool._everWorked ) )
                throw lastError;


            // 超时处理
            
            long sleptSoFar = System.currentTimeMillis() - start;

            if ( sleptSoFar >= CONN_RETRY_TIME_MS )
                throw lastError;
            
            if ( sleepTime + sleptSoFar > CONN_RETRY_TIME_MS )
                sleepTime = CONN_RETRY_TIME_MS - sleptSoFar;

            //  等待重试
            _logger.severe( "going to sleep and retry.  total sleep time after = " + ( sleptSoFar + sleptSoFar ) + "ms  this time:" + sleepTime + "ms" );
            ThreadUtil.sleep( sleepTime );
            sleepTime *= 2;
        }
    }
2
0
分享到:
评论
1 楼 rolenz 2012-02-26  
你好,我这有一个问题,今天看了下API源码,但是水平有限,不知道该怎么解决
有一个List ArrayList<Long> al=new ArrayList<Long>();里面存储了从外部获取的数据的ID并且进行了排序(随机抽取的ID,按照先后放入LIST),然后把这些ID在mongoDB通过inObj.put("_id", new BasicDBObject("$in", list));进行in查询,获取后的结果并不和LIST中ID的顺序一样。
我这种情况改怎么查询,才能使从mongodb中获取的结果顺序和list中的一样

相关推荐

    数据库驱动常见错误"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 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-java-driver-4.4.0.jar

    mongodb-java-driver-4.4.0.jar

    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 ...

    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.12.7.jar

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

    mongo-java-driver-3.2.2.jar.zip

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

    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

    MongoDB Java驱动API是用于与MongoDB数据库交互的Java库,它是MongoDB官方提供的一个关键组件,使得Java开发者能够方便地在应用程序中存取数据。MongoDB是一个高性能、开源、无模式的文档型数据库,而Java驱动API则...

    mongodb-java-driver源码依赖库

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

    MongoDb java driver 3.4.2

    3. **连接MongoDB**:使用`com.mongodb.MongoClient`类,开发者可以建立到MongoDB服务器的连接。这个类提供了连接字符串和服务器地址等参数,以便连接到指定的MongoDB实例。 4. **数据库操作**:一旦建立了连接,...

    MongoDBjava各版本驱动下载

    MongoDB Java驱动是Java开发者与MongoDB数据库交互的重要工具,它允许Java应用程序通过标准的Java API来执行查询、插入、更新和删除等操作。在Java中使用MongoDB,首先需要安装并配置对应的驱动版本,以确保与正在...

Global site tag (gtag.js) - Google Analytics