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
  • Если вы хотите установить другие параметры подключения, вы можете объединить несколько параметров, используя '&'; Документация здесь: https://mongodb.github.io/mongo-java-driver/3.4/javadoc/com/mongodb/MongoClientURI.html
  • Если вы использовали другие параметры spring.data.mongodb, вы должны удалить их все, иначе spring не прочитает spring.data.mongodb.uri

Ответ 5

Проверьте ваш файл application.properties, у вас должно быть правильное значение для "spring.data.mongodb.uri", которое является правильным именем пользователя базы данных, паролем, dburl, портом, именем dbname, sslauthSource все вместе.

Ответ 6

Убедитесь, что ваш IP-адрес находится в белом списке в облаке mongodb.