本文共 4001 字,大约阅读时间需要 13 分钟。
mongodb版本:4.0.1mongodb-driver: 3.6.4
由于工作需要,线上mongodb中的部分集合需要添加一些新的字段。核心代码如下:
MongoCollectioninput = mongoDatabase.getCollection(inputCollection);MongoCollection output = mongoDatabase.getCollection(outputCollection);FindIterable findIterable = input.find();MongoCursor mongoCursor = findIterable.iterator(); while(mongoCursor.hasNext()){ Document outputDocument = new Document(); Document document = mongoCursor.next(); for (String key: document.keySet()) { //......... // 添加字段,具体不列出 } outputDocument.append(key, document.get(key)); } output.insertOne(outputDocument); }
在线上运行一段时间后,程序报出如下异常:
Exception in thread "main" com.mongodb.MongoSocketReadException: Exception receiving message at com.mongodb.internal.connection.InternalStreamConnection.translateReadException(InternalStreamConnection.java:543) at com.mongodb.internal.connection.InternalStreamConnection.receiveMessage(InternalStreamConnection.java:428) at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:289) at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:255) at com.mongodb.internal.connection.UsageTrackingInternalConnection.sendAndReceive(UsageTrackingInternalConnection.java:99) at com.mongodb.internal.connection.DefaultConnectionPool$PooledConnection.sendAndReceive(DefaultConnectionPool.java:444) at com.mongodb.internal.connection.CommandProtocolImpl.execute(CommandProtocolImpl.java:72) at com.mongodb.internal.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:200) at com.mongodb.internal.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:269) at com.mongodb.internal.connection.DefaultServerConnection.command(DefaultServerConnection.java:131) at com.mongodb.operation.MixedBulkWriteOperation.executeCommand(MixedBulkWriteOperation.java:418) at com.mongodb.operation.MixedBulkWriteOperation.executeBulkWriteBatch(MixedBulkWriteOperation.java:256) at com.mongodb.operation.MixedBulkWriteOperation.access$700(MixedBulkWriteOperation.java:67) at com.mongodb.operation.MixedBulkWriteOperation$1.call(MixedBulkWriteOperation.java:200) at com.mongodb.operation.MixedBulkWriteOperation$1.call(MixedBulkWriteOperation.java:191) at com.mongodb.operation.OperationHelper.withReleasableConnection(OperationHelper.java:419) at com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:191) at com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:67) at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.execute(MongoClientDelegate.java:193) at com.mongodb.client.internal.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:960) at com.mongodb.client.internal.MongoCollectionImpl.executeInsertOne(MongoCollectionImpl.java:494) at com.mongodb.client.internal.MongoCollectionImpl.insertOne(MongoCollectionImpl.java:478) at com.mongodb.client.internal.MongoCollectionImpl.insertOne(MongoCollectionImpl.java:472) at com.zhishen.TestJoin.main(TestJoin.java:83)Caused by: java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:210) at java.net.SocketInputStream.read(SocketInputStream.java:141) at com.mongodb.internal.connection.SocketStream.read(SocketStream.java:89) at com.mongodb.internal.connection.InternalStreamConnection.receiveResponseBuffers(InternalStreamConnection.java:554) at com.mongodb.internal.connection.InternalStreamConnection.receiveMessage(InternalStreamConnection.java:425)
mongodb server与client建立的连接在出现一些连接失效(比如网络链路突然中断)时,client在默认情况下并不会主动回收这些连接,而当再次读写此连接时就会出现上述错误。
MongoClientOptions.Builder builder = new MongoClientOptions.Builder();builder.maxConnectionIdleTime(60000);//set the max wait time in (ms)MongoClientOptions opts = builder.build();
重新打包运行,没有出现异常,问题解决。
转载地址:http://qzjmb.baihongyu.com/