MongoDB:java.lang.IllegalStateException:状态应为:open

我有一个应用程序,它从一个来源提取数据,然后将其向上插入到MongoDB中.有时,拉取过程会花费很多时间,当应用尝试将行推入MongoDB时,可能会引发超时问题,引发以下异常:

 

 

com.mongodb.MongoSocketReadException: Prematurely reached end of stream
    at com.mongodb.connection.SocketStream.read(SocketStream.java:88)
    at com.mongodb.connection.InternalStreamConnection.receiveResponseBuffers(InternalStreamConnection.java:492)
    at com.mongodb.connection.InternalStreamConnection.receiveMessage(InternalStreamConnection.java:222)
    at com.mongodb.connection.UsageTrackingInternalConnection.receiveMessage(UsageTrackingInternalConnection.java:105)
    at com.mongodb.connection.DefaultConnectionPool$PooledConnection.receiveMessage(DefaultConnectionPool.java:438)
    at com.mongodb.connection.WriteCommandProtocol.receiveMessage(WriteCommandProtocol.java:262)
    at com.mongodb.connection.WriteCommandProtocol.execute(WriteCommandProtocol.java:104)
    at com.mongodb.connection.UpdateCommandProtocol.execute(UpdateCommandProtocol.java:64)
    at com.mongodb.connection.UpdateCommandProtocol.execute(UpdateCommandProtocol.java:37)
    at com.mongodb.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:168)
    at com.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:289)
    at com.mongodb.connection.DefaultServerConnection.updateCommand(DefaultServerConnection.java:143)
    at com.mongodb.operation.MixedBulkWriteOperation$Run$3.executeWriteCommandProtocol(MixedBulkWriteOperation.java:481)
    at com.mongodb.operation.MixedBulkWriteOperation$Run$RunExecutor.execute(MixedBulkWriteOperation.java:647)
    at com.mongodb.operation.MixedBulkWriteOperation$Run.execute(MixedBulkWriteOperation.java:400)
    at com.mongodb.operation.MixedBulkWriteOperation$1.call(MixedBulkWriteOperation.java:180)
    at com.mongodb.operation.MixedBulkWriteOperation$1.call(MixedBulkWriteOperation.java:169)
    at com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:232)
    at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:223)
    at com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:169)
    at com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:75)
    at com.mongodb.Mongo.execute(Mongo.java:827)
    at com.mongodb.Mongo$2.execute(Mongo.java:810)
    at com.mongodb.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:515)
    at com.mongodb.MongoCollectionImpl.update(MongoCollectionImpl.java:508)
    at com.mongodb.MongoCollectionImpl.updateOne(MongoCollectionImpl.java:355)
    at com.test.db.mongoDB.RetryingMongoCollection.updateOne(RetryingMongoCollection.java:909)

每个MongoException都有一个包装的MongoCollection类,现在抛出了java.lang.IllegalStateException的包装.

 

@Override
public UpdateResult updateOne(Bson filter, Bson update,
        UpdateOptions updateOptions) {
    UpdateResult retVal = null;
    final ExceptionHelper ex = new ExceptionHelper(CAConstants.RETRIES, ErrorType.ERROR, true);
    boolean isDone = false;
    while (!isDone) {
        try {
            retVal = proxied.updateOne(filter, update, updateOptions);
            isDone = true;
        } catch (final MongoException | IllegalStateException e) {
            ex.logIfZero("Failed to launch MongoDB operation", e);
            if (ex.lastTry()) {
                isDone = true;
                Log.error("Failed to launch MongoDB operation.", e);
            } else {
                Log.error("[MDB] Going to update mongo instance due to exception", e);
                db = MongoDBFactory.getUpdatedMongoDBInstance();
                setCollection();
            }
        }
    }
    return retVal;
}

尝试重新加载MongoClient:

 

        if ( mongoClient != null ) {
            try {
                mongoClient.close();
            } catch (Exception e) {
                Log.error("Mongo client throws exception while closing connection", e);
            }
...
        mongoClient = new MongoClient(servers, Arrays.asList(credential), 
                new MongoClientOptions.Builder()
                    .requiredReplicaSetName(REPLICASET_NAME)
                    .connectTimeout(0)
                    .connectionsPerHost(CONNECTION_PER_HOST)
                    .cursorFinalizerEnabled(false)
                    .build());

        db = mongoClient.getDatabase(database);

但是,在“ com.mongodb.MongoSocketReadException:过早到达流的末尾”之后更新mongoClient时,它将失败并显示:

 

java.lang.IllegalStateException: state should be: open
    at com.mongodb.assertions.Assertions.isTrue(Assertions.java:70)
    at com.mongodb.connection.BaseCluster.selectServer(BaseCluster.java:82)
    at com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.<init>(ClusterBinding.java:75)
    at com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.<init>(ClusterBinding.java:71)
    at com.mongodb.binding.ClusterBinding.getWriteConnectionSource(ClusterBinding.java:68)
    at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:221)
    at com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:169)
    at com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:75)
    at com.mongodb.Mongo.execute(Mongo.java:827)
    at com.mongodb.Mongo$2.execute(Mongo.java:810)
    at com.mongodb.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:515)
    at com.mongodb.MongoCollectionImpl.update(MongoCollectionImpl.java:508)
    at com.mongodb.MongoCollectionImpl.updateOne(MongoCollectionImpl.java:355)
    at com.test.db.mongoDB.RetryingMongoCollection.updateOne(RetryingMongoCollection.java:909)

并一直持续失败…

我使用mongoDB 3.2.9版;
Mongo Java客户端3.3.0

请支持.

Inm小程序商店 | Vultr中文网

最佳答案

尝试在MongoClientOptions中设置maxConnectionIdleTime选项(尤其是在使用托管MongoDB环境的情况下)

 

例:

 

    new MongoClientOptions.Builder()
    .requiredReplicaSetName(REPLICASET_NAME)
    .maxConnectionIdleTime (MAX_IDLE_TIME)
    .connectionsPerHost(CONNECTION_PER_HOST)
    .cursorFinalizerEnabled(false)
    .build();

connectTimeout具有误导性,因为它是初始连接的超时设置.

对于有关重新初始化MongoClient的问题,请确保客户端代码在正确的范围内,以使插入代码可以使用.另外,我只看到数据库,而不是集合级对象(代理?)被重新初始化.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值