2016-11-18 3 views
0

私は、あるソースからデータを取得し、それをMongoDBにアップアップするアプリケーションを持っています。時々引っ張っプロセスは多くの時間がかかり、アプリは以下の例外をMongoDBのために行をプッシュしようとするとタイムアウトの問題におそらく発生しますMongoDB:java.lang.IllegalStateException:状態はopenであるべきです:

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) 

今そこはMongoCollectionクラスのラッパーは、各MongoExceptionのためということで、 mongoClientをリロードする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; 
} 

試行のために:

 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); 

しかし、mongoClientが後方に更新されたときER "com.mongodb.MongoSocketReadException:途中でストリームの終わりに達した" ことがで失敗します。私は3.2.9のverにMongoDBを使用して...

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) 

とすべての時間を失敗し続け

を。 Mongo Javaクライアント3.3.0

サポートしてください。

+0

この質問をmongodb-userグループ(https://groups.google.com/forum/#!topic/mongodb-user/hhoFxnSplfI)に投稿したことに気がつきました。ここで、RossはあなたにJiraのフォローアップを依頼しました問題。 Jiraでレポートを提出するか、タイムアウトエラーの解決策を見つけましたか? 「引き上げに時間がかかる」と、どれくらいの期間ですか? – Stennie

+0

こんにちはStennie、プルプロセスは1時間以上かかることがあります。ポイントは、異なるテーブルからデータを1つずつ取り出すことです。だから、私たちはそれを制御しない... – EVG

答えて

2

例(あなたがホストされたMongoDBの環境を使用している場合は特に)あなたのMongoClientOptionsにmaxConnectionIdleTimeオプションを設定してみてください:それは初期接続のタイムアウト設定であるよう

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

のconnecttimeoutは誤解を招くです。

MongoClientを再初期化する際の問題については、クライアントコードが挿入コードが正しい範囲に収まっていることを確認してください。また、私はデータベースのみを参照し、コレクションレベルのオブジェクト(プロキシ?)は再初期化されていません。

関連する問題