Тайм-аут сокета с DB Монго после 30 минут бездействия - PullRequest
0 голосов
/ 10 сентября 2018

После 30 минут бездействия или около того, я начинаю получать сообщение об ошибке ниже, когда я пытаюсь вставить в монго, при повторной попытке он начинает работать. Ошибка ниже. Я на Лазурном:

[INFO ] 2018-09-10T12:00:43,188 [http-nio-8080-exec-6] connection - Closed connection [connectionId{localValue:3, serverValue:26}] to XX.XX.XX.XX:27017 because there was a socket exception raised by this connection.
[ERROR] 2018-09-10T12:00:43,189 [http-nio-8080-exec-6] [dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.mongodb.UncategorizedMongoDbException: Timeout while receiving message; nested exception is com.mongodb.MongoSocketReadTimeoutException: Timeout while receiving message] with root cause
java.net.SocketTimeoutException: Read timed out
        at java.net.SocketInputStream.socketRead0(Native Method) ~[?:1.8.0_181]
        at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) ~[?:1.8.0_181]
        ava.net.SocketTimeoutException: Read timed out
t java.net.SocketInputStream.read(SocketInputStream.java:171) ~[?:1.8.0_181]
        at java.net.SocketInputStream.read(SocketInputStream.java:141) ~[?:1.8.0_181]

Вот как я инициализирую мой монго Шаблон:

@Bean
    public MongoDbFactory mongoDbFactory() {
        String[] addresses = mongoUri.split(",");
        List<ServerAddress> servers = new ArrayList<>();
        for (String address : addresses) {
            String[] split = address.trim().split(":");
            servers.add(new ServerAddress(split[0].trim(), Integer.parseInt(split[1].trim())));
        }
        MongoClientOptions.Builder mongoOperations = MongoClientOptions.builder();
        mongoOperations.socketTimeout(1000 * 20); // I tried to increase the socket timeout to see if it helps but no help either
        mongoOperations.connectTimeout(1000 * 10);
        MongoClient mongoClient = new MongoClient(servers, MongoCredential.createCredential(userName, dbName, password.toCharArray()), mongoOperations.build());
        return new SimpleMongoDbFactory(mongoClient, dbName);
    }

    @Bean
    public MongoTemplate getMongoTemplate() {
        return new MongoTemplate(mongoDbFactory());
    }

Моя версия mongod 3.6.4, и я использую ту же версию драйвера java. Я пытался увеличить / уменьшить настройку tcp_keepalive_time, как указано в документации, используя sudo sysctl -w net.ipv4.tcp_keepalive_time=120 но тоже не поможет.

1 Ответ

0 голосов
/ 10 ноября 2018

ОХК. поэтому мы обнаружили, что mongo java driver jar был старше, чем сервер Монго, который мы использовали, что вызывало эту проблему. убедитесь, что драйвер поддерживает версию сервера mongo.

...