0

我使用 mongo-java-driver 3.1.0。JAVA和MongoDB连接没有问题。我可以使用 JAVA 从 MongoDB 获取数据并将数据写入 MongoDB。

但是当我尝试写入更多数据时,我的 java 控制台出现了这个错误。我认为当套接字连接持续超过 30 秒时,MongoDB 客户端会崩溃。直到 30 秒,部分数据被插入到 MongoDB (myCollection) 首先我得到;

com.mongodb.MongoSocketReadException:过早到达流的末尾

接着

com.mongodb.MongoTimeoutException:在等待与 ReadPreferenceServerSelector{readPreference=primary} 匹配的服务器时,在 30000 毫秒后超时

我没有设置任何超时,所以它的超时应该是无限的。

有人可以帮忙吗

public void writeDB() {

    MongoClient mongoClient = new MongoClient ("127.0.0.1", 27017);
    mongoClient.setWriteConcern(WriteConcern.JOURNALED);

    DB database = mongoClient.getDB("myCollection");    
    BasicDBObject newDataObject = new BasicDBObject();    
    DBCollection collection = database.getCollection("myCollection");    

    int number = 0;    
    for (int i = 0; i <= 1000000; i++) {
    if(CHECKDATA_EXIST) {
        int randomCount = (10 + (Math.random() * 300));    
        for (int j = 0; j < randomCount; j++) {
            number = i + randomCount;
        }

        newDataObject.put("_id", i);
        newDataObject.put("myNumber", number);    
        collection.insert(newDataObject);
    }
    }
}

顺便说一句,在粉碎之后我无法再写入或获取任何数据。要写入数据,我必须重新启动“mongod”。

我为 if case 添加了 CHECKDATA_EXIST 方法(我的代码包括该方法)。我忘了补充。该方法检查 id 是否存在。

4

2 回答 2

1

嗨,我有一段时间遇到同样的问题,然后我发现了这个http://3t.io/blog/how-to-prevent-your-connection-from-dropping-with-hosted-mongodb-instances/

它说连接可能会在一段时间不活动后断开,但当您尝试再次连接时会重新连接。

如果您的代码是长时间运行的应用程序,我建议您进行如下更改:更改连接构造函数添加MongoClientOptions

    public void writeDB() {

        MongoClientOptions.Builder builder = new MongoClientOptions.Builder();

         //build the connection options  
        builder.maxConnectionIdleTime(60000);//set the max wait time in (ms)
        MongoClientOptions opts = builder.build();


<strike>MongoClient mongoClient = new MongoClient ("127.0.0.1", 27017);</strike>

        MongoClient mongoClient = new MongoClient ("127.0.0.1:27017", opts);
        mongoClient.setWriteConcern(WriteConcern.JOURNALED);

        DB database = mongoClient.getDB("myCollection");    
        BasicDBObject newDataObject = new BasicDBObject();    
        DBCollection collection = database.getCollection("myCollection");



        int number = 0;    
        for (int i = 0; i <= 1000000; i++) {
            if(CHECKDATA_EXIST) {
            int randomCount = (10 + (Math.random() * 300));    
        for (int j = 0; j < randomCount; j++) {
            number = i + randomCount;
        }

        newDataObject.put("_id", i);
        newDataObject.put("myNumber", number);    
        collection.insert(newDataObject);
    }
    }
}

希望这会有所帮助

于 2016-09-16T05:46:39.783 回答
0

在您的代码中,您在循环中插入单个文档,因此不是发送每个文档,而是使用批量写入相应地更改了您的代码。

检查下面的代码片段:

DBCollection collection = database.getCollection("myCollection");
BulkWriteOperation  bulkWriteOperation= collection.initializeUnorderedBulkOperation();
 for (int i = 0; i <= 1000000; i++) {
            BasicDBObject newDataObject = new BasicDBObject();
            IncrementalStat incrementalStat = new IncrementalStat();
            double randomCount = (10 + (Math.random() * 300));

            for (int j = 0; j < randomCount; j++) {
                number = i + randomCount;
            }

            newDataObject.put("_id", i);
            newDataObject.put("myNumber", number); 
             bulkWriteOperation.insert(newDataObject);
        }
       //write all data using bulk execute
         BulkWriteResult result=bulkWriteOperation.execute();
于 2015-10-08T07:28:43.307 回答