web-dev-qa-db-ja.com

MongoSocketReadException:ストリームが途中で終了した(非アクティブな期間の後)

このエラーは、find呼び出し(デフォルトJava Driver)の非アクティブ期間後に発生します。手動のハートビート(上限付きコレクションへの書き込み)を追加しようとしましたが、作成時にインスタンスに接続しているときにのみ問題が発生します(つまり、ローカルコンテキストではありません)。

MongoDBバージョンは3.2.8、最新ドライバー(3.3)、Java 8。

何か案が ?

20
Rhangaun

私はここでのRhaangaunの答えに同意します、Javaのコードでの私の選択です:

    public static DB getMongoDB() {

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


        char[] password2 = "mypassword".toCharArray();

        MongoCredential credential2 = MongoCredential.createCredential("username", "databasename",password2);


        //add your option to the connection 

        MongoClient mongoClient = new MongoClient(new ServerAddress("server ip",27017), Arrays.asList(credential2),opts);
        //use your database 
        cachedDb = mongoClient.getDB("databasename");

    return cachedDb;

}

ここに私の研究リンクがあります: http://3t.io/blog/how-to-prevent-your-connection-from-dropping-with-hosted-mongodb-instances/

お役に立てば幸いです。

2
Daqian

私はいくつかのドキュメントでそれを見つけました:

長時間実行されるアプリケーションでは、多くの場合、ミリ秒単位で「keepAlive」を有効にすることが賢明です。それなしでは、しばらくすると、理由がないと思われる「接続が閉じられました」というエラーが表示されるようになります。

これが役立つかどうかを確認してください。 mongoDBに接続すると、ソケットオプションを渡すことができます。私はノードのバックグラウンドから来ており、次のオプションを使用してそれを維持します。

server: {
        socketOptions: {
            keepAlive: 100,
            connectTimeoutMS: 30000
        }
    }

お役に立てれば!!

20
Developer

SslEnabledをtrueに設定してこの問題を解決します。サンプルコード:

@Bean
public MongoClient mongoClient() {
    List<ServerAddress> saList = new ArrayList<>();
    saList.add(new ServerAddress("cluster0-shard-00-00-75shm.gcp.mongodb.net", 27017));
    saList.add(new ServerAddress("cluster0-shard-00-01-75shm.gcp.mongodb.net", 27017));
    saList.add(new ServerAddress("cluster0-shard-00-02-75shm.gcp.mongodb.net", 27017));

    char[] pwd =  "password".toCharArray();
    MongoCredential credential = MongoCredential.createCredential("username", "admin", pwd);

    //set sslEnabled to true here
    MongoClientOptions options = MongoClientOptions.builder()
            .readPreference(ReadPreference.primaryPreferred())
            .retryWrites(true)
            .requiredReplicaSetName("Cluster0-shard-0")
            .maxConnectionIdleTime(6000)
            .sslEnabled(true)
            .build();

    MongoClient mongoClient = new MongoClient(saList, credential, options);     
    return mongoClient;
}

追加:クライアントjarはorg.mongodb.mongodb-driver 3.6.4、サーバーはGCP上のmongodb atlas M0 3.6.6です

7
iengchen

これは、スプリングブートとクラウドベースのmongo(Atlasクラスターインスタンス)で機能しました。

Application.propertiesを次のように編集します。

spring.data.mongodb.uri = mongodb+srv://username:[email protected]/dbname

通常のmongoインスタンス(非クラスター化)の場合:

spring.data.mongodb.uri = mongodb://username:[email protected]:27017,hostname2:27017/dbname?ssl=true
2
cepix