web-dev-qa-db-fra.com

MongoSocketReadException: fin prématurée du flux (après une période d'inactivité)

Je reçois cette erreur lors d'un appel find (pilote Java par défaut) après une période d'inactivité. J'ai essayé d'ajouter une pulsation manuelle (écrire dans une collection limitée), mais cela n'a pas aidé. Je ne reçois le problème que lorsque je suis connecté à une instance sur compose (c'est-à-dire pas dans un contexte local).

La version de MongoDB est la version 3.2.8, dernier pilote (3.3), utilisant Java 8.

Une idée ?

14
Rhangaun

Je suis d'accord avec la réponse de Rhangaun, voici ma solution au code de 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;

}

Voici mon lien de recherche: http://3t.io/blog/how-to-prevent-your-connection-from-dropping-with-hosted-mongodb-instances/

J'espère que ça vous aide.

2
Daqian

Je l'ai trouvé dans une documentation:

Pour les applications de longue durée, il est souvent prudent d'activer "keepAlive" avec un nombre de millisecondes. Sans cela, après un certain temps, vous risquez de voir apparaître des erreurs "Connexion fermée" sans aucune raison.

Vérifiez si cela aide. Lorsque vous vous connectez à mongoDB, vous pouvez lui transmettre des options de socket. Je viens de fond de noeud, nous utilisons les options suivantes pour le garder en vie.

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

J'espère que cela t'aides!!

14
Developer

Je résous ce problème en définissant sslEnabled sur true, exemple de code:

@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;
}

Ajout: mon fichier client est org.mongodb.mongodb-driver 3.6.4, le serveur est mongodb atlas M0 3.6.6 sur GCP

4
iengchen

Cela a fonctionné pour moi dans le démarrage printanier et le mongo basé sur le cloud (instances en cluster Atlas).

Éditez application.properties comme ceci:

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

Pour regular mongo instances (non clusterisé), utilisez ceci:

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