Тайм-аут при получении сообщения с пулом Mongo Connection с использованием java

В производстве мы подключаемся к MongoDB с помощью Java (пул соединений). Каждый день мы получаем почти 500 запросов с приведенной ниже ошибкой (MongoSocketReadTimeoutException), и мы не используем никаких сложных запросов. Может быть, это устаревшие соединения Mongo?

Я не видел проблем с нашим кодом или медлительностью MongoDB. Пожалуйста, просмотрите мой код ниже и предложите, нужно ли добавить какие-либо параметры или что-то изменить.

    at 2018-03-07 19:52:43 ERROR ::Error while connecting the Mongo DB {}
com.mongodb.MongoSocketReadTimeoutException: Timeout while receiving message
        at com.mongodb.connection.InternalStreamConnection.translateReadException(InternalStreamConnection.java:474)
        at com.mongodb.connection.InternalStreamConnection.receiveMessage(InternalStreamConnection.java:225)
        at com.mongodb.connection.UsageTrackingInternalConnection.receiveMessage(UsageTrackingInternalConnection.java:102)
        at com.mongodb.connection.DefaultConnectionPool$PooledConnection.receiveMessage(DefaultConnectionPool.java:435)
        at com.mongodb.connection.CommandProtocol.execute(CommandProtocol.java:112)
        at com.mongodb.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:159)
        at com.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:286)
        at com.mongodb.connection.DefaultServerConnection.command(DefaultServerConnection.java:173)
        at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:215)
        at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:206)
        at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:112)
        at com.mongodb.operation.FindOperation$1.call(FindOperation.java:487)
        at com.mongodb.operation.FindOperation$1.call(FindOperation.java:482)
        at com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:239)
        at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:212)
        at com.mongodb.operation.FindOperation.execute(FindOperation.java:482)
        at com.mongodb.operation.FindOperation.execute(FindOperation.java:79)
        at com.mongodb.Mongo.execute(Mongo.java:772)
        at com.mongodb.Mongo$2.execute(Mongo.java:759)
        at com.mongodb.FindIterableImpl$FindOperationIterable.first(FindIterableImpl.java:207)
        at com.mongodb.FindIterableImpl.first(FindIterableImpl.java:148)
        at com.tecnotree.bom.validation.dao.MongoManager.getJsonObject(MongoManager.java:88)
        at com.tecnotree.bom.validation.dao.CustomerMasterDao.getService(CustomerMasterDao.java:48)
        at com.tecnotree.bom.validation.service.ValidationService.processValidation(ValidationService.java:214)
        at com.tecnotree.bom.validation.service.ValidationService.processRequest(ValidationService.java:125)
        at sun.reflect.GeneratedMethodAccessor185.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
        at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvid
er.java:205)

Код

public class ConnectionManager {
    private ConnectionManager() {

    }
    private static final Logger logger = LoggerFactory.getLogger(ConnectionManager.class);
    private static MongoClient mongoClient = null;


    private static String connections = null;
    private static String connectionTimeOut = null;
    private static String socketTimeOut = null;
    private static String serverSelectionTimeOut = null;
    private static String URL = null;
    private static String username = null;
    private static String password = null;
    private static String hostname = null;
    private static String port = null;
    private static String maxConnectionIdleTime = null;
    private static String minConnectionsPerHost = null;
    private static String maxConnectionLifeTime = null;



    private static String dbName = null;

    static {
        dbName = ValidationProperties.getValue("clm.db.dbName");
        mongoClient = getCLMSecondaryMongoConnection();


    }

    private static MongoClient getCLMSecondaryMongoConnection() {

        connections = ValidationProperties.getValue("clm.db.connectionsPerHost");
        connectionTimeOut = ValidationProperties.getValue("clm.db.connectTimeoutMS");
        socketTimeOut = ValidationProperties.getValue("clm.db.socketTimeOut");
        serverSelectionTimeOut = ValidationProperties.getValue("clm.db.serverSelectionTimeOut");
        username = ValidationProperties.getValue("clm.db.userName");
        password = ValidationProperties.getValue("clm.db.password");
        hostname = ValidationProperties.getValue("clm.db.hostname");
        port = ValidationProperties.getValue("clm.db.portnumber");
        maxConnectionIdleTime = ValidationProperties.getValue("clm.db.maxConnectionIdleTime");
        minConnectionsPerHost = ValidationProperties.getValue("clm.db.minConnectionsPerHost");

        try {
            List<MongoCredential> creds = new ArrayList<MongoCredential>();
            creds.add(MongoCredential.createCredential(username, dbName, password.toCharArray()));
            /*creds.add(MongoCredential.createMongoCRCredential(username, dbName, password.toCharArray()));*/
            MongoClientOptions.Builder optionsBuilder = MongoClientOptions.builder();
            optionsBuilder.connectTimeout(Integer.parseInt(connectionTimeOut));
            optionsBuilder.serverSelectionTimeout(Integer.parseInt(serverSelectionTimeOut));
            optionsBuilder.socketTimeout(Integer.parseInt(socketTimeOut));
            optionsBuilder.connectionsPerHost(Integer.parseInt(connections));
            optionsBuilder.maxConnectionIdleTime(Integer.parseInt(maxConnectionIdleTime));
            optionsBuilder.minConnectionsPerHost(Integer.parseInt(minConnectionsPerHost));
            if(Boolean.valueOf(ValidationProperties.getValue("clm.db.useSecondaryMongoForRead"))) {
                logger.info("Read is going for secondary mongoDB");
                optionsBuilder.readPreference(ReadPreference.secondaryPreferred());
            }


            MongoClientOptions options = optionsBuilder.build();
            mongoClient = new MongoClient(new ServerAddress(hostname, Integer.parseInt(port)), creds, options);

        } catch (Exception e) {
            logger.error("Error while connecting the Mongo DB {}", e);

        }
        return mongoClient;

    }



    public static MongoClient getMongoClient() {
        return mongoClient;
    }

person Narasimha    schedule 07.03.2018    source источник
comment
вы нашли решение этого? каковы ваши настройки, если да   -  person Jeryl Cook    schedule 04.02.2021


Ответы (2)


В своем коде вы устанавливаете различные MongoClientOptions, но не указываете, какие значения вы используете. Скорее всего, проблема связана с одной из настроек. Мое первое предположение будет заключаться в том, что socketTimeout слишком мало, мое второе предположение будет заключаться в том, что connectionPerHost меньше, чем максимальное количество одновременных запросов, которые вы получаете в производстве.

Я предполагаю, что тестирование в вашей производственной среде не вариант, поэтому первое, что вы должны сделать, это попытаться воспроизвести проблему в тестовой среде. Вы можете использовать бесплатный инструмент JMeter для воспроизведения определенной нагрузки на ваш сервер. Используйте его функцию нарастания, чтобы увидеть, начинаются ли ваши проблемы, когда вы достигаете определенной нагрузки, или они возникают случайным образом.

Если у вас все еще есть проблемы с определением того, что именно вызывает проблемы, вы также можете попробовать закомментировать все настройки optionBuilder (чтобы вы использовали все настройки по умолчанию). Если это устранит проблему, вы можете по одному возвращать параметры конфигурации, чтобы увидеть, какой из них является проблемным.

person THelper    schedule 15.12.2019

Вы должны удалить зависимость hibernate из своего проекта.
Я столкнулся с этой проблемой, и это было решением.

person Dali    schedule 02.06.2021