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 ?
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.
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!!
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
É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