MongoSocketReadException: преждевременно достигнутый конец потока (после периода бездействия)
Я получаю эту ошибку при вызове find
(драйвер Java по умолчанию) после периода бездействия. Я попытался добавить ручное сердцебиение (запись в ограниченную коллекцию), но это не помогло. Я получаю эту проблему только при подключении к экземпляру для компоновки (т.е. Не в локальном контексте).
Версия MongoDB - 3.2.8, последний драйвер (3.3), использующий Java 8.
Есть идеи?
Ответы
Ответ 1
Я согласен с ответом Rhangaun, вот мое совпадение в коде 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
Я нашел его в некоторых документах:
Для приложений с большим сроком службы часто разумно включать "keepAlive" с несколькими миллисекундами. Без этого через некоторый период времени вы можете начать видеть ошибки "соединения закрыты" для того, что кажется неразумным.
Проверьте, помогает ли это. Когда вы подключаетесь к mongoDB, вы можете передать ему параметры сокета. Я из фона узла, мы используем следующие параметры, чтобы сохранить его.
server: {
socketOptions: {
keepAlive: 100,
connectTimeoutMS: 30000
}
}
Надеюсь это поможет!!
Ответ 3
Я решаю эту проблему, задавая 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;
}
Дополнение: моя клиентская банка - org.mongodb.mongodb-driver 3.6.4, сервер - атлас mongodb M0 3.6.6 на GCP
Ответ 4
Это работало для меня в весенних загрузочных и облачных монго (кластерные экземпляры Atlas).
Отредактируйте свойства application.properties следующим образом:
spring.data.mongodb.uri = mongodb+srv://username:[email protected]/dbname
Для обычных экземпляров Монго (некластеризованных) используйте это:
spring.data.mongodb.uri = mongodb://username:[email protected]:27017,hostname2:27017/dbname?ssl=true
Ответ 5
Проверьте ваш файл application.properties, у вас должно быть правильное значение для "spring.data.mongodb.uri", которое является правильным именем пользователя базы данных, паролем, dburl, портом, именем dbname, sslauthSource все вместе.
Ответ 6
Убедитесь, что ваш IP-адрес находится в белом списке в облаке mongodb.