R2dbcTimeoutException: время ожидания подключения истекло, несмотря на достаточное количество выделенных соединений MAX JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 R2dbcTimeoutException: время ожидания подключения истекло, несмотря на достаточное количество выделенных соединений MAX

Сообщение Anonymous »

Я работаю над реактивным приложением Java Spring Boot, используя R2DBC с MySQL. Ниже приведена настроенная мной конфигурация пула соединений:

Код: Выделить всё

spring.r2dbc.pool.enabled=true
spring.r2dbc.pool.initial-size=0
spring.r2dbc.pool.max-size=20
spring.r2dbc.pool.max-acquire-time=30s
spring.r2dbc.pool.max-idle-time=1m
Подробности рабочего процесса приложения:
А. Создание данных для обработки (используется 1 поток)
  • Этот рабочий процесс принимает сообщения из SQS и обрабатывает их для создания данных.
  • МетодprocessMessage является реактивным и генерирует данные с использованием реактивного потока.
  • В этом случае я использую .block(), поскольку у меня настроен сеанс Режим подтверждения как CLIENT_ACKNOWLEDGE:

    Код: Выделить всё

    myConsumerService.processMessage(message).block();
Б. Обработка данных (использует 10 потоков)
  • Для одновременной обработки операций с данными используются 10 потоков.
  • Один поток выполняет 3 операции MySQL одну за другой.
  • Каждая операция MySQL Выполнение занимает всего несколько миллисекунд.
  • Следующий код извлекает записи для операций MySQL:

    Код: Выделить всё

     public class MyRepository {
    
    private final R2dbcEntityTemplate template;
    
    public MyRepository(R2dbcEntityTemplate template) {
    this.template = template;
    }
    
    public Mono getEntityById(Long id) {
    return template.select(MyEntity.class)
    .matching(Query.query(Criteria.where("id").is(id))).one();
    }
    }
    
Проблема:
Несмотря на то, что я настроил пул с максимальным размер 20, я заметил, что пул соединений выделяет 20 соединений, что превышает ожидаемое значение 11. Согласно журналам, соединения выделяются непосредственно перед операциями MySQL и освобождаются сразу после, как и ожидалось.
Вот соответствующие журналы отладки из Пул соединений R2DBC (с уровнем ведения журнала DEBUG):

Код: Выделить всё

ConnectionPoolStats : Allocated : 20, Acquired : 1, Idle : 0, Pending : 9
Ожидаемое поведение:
Приложение должно использовать максимум 11 соединений, из которых 1 поток предназначен для генерации данных и 10 выделенных потоков. для обработки операций MySQL.
Фактическое поведение:
Несмотря на конфигурацию, журналы показывают, что пул соединений выделяет 20 соединений, что приводит к новым запросам на соединение. помещается в ожидание состояние, вызывающее следующее исключение:

Код: Выделить всё

Caused by: io.r2dbc.spi.R2dbcTimeoutException: Connection acquisition timed out after 30000ms
Код для получения показателей пула:
Я использую следующий код для получения показателей пула соединений:

Код: Выделить всё

 PoolMetrics metrics = connectionPool.getMetrics().orElse(null);

if (metrics != null) {
String connectionPoolStats = String.format("Allocated : %d, Acquired : %d, Idle : %d, Pending : %d",
metrics.allocatedSize(), metrics.acquiredSize(),
metrics.idleSize(), metrics.pendingAcquireSize());
logger.info("ConnectionPoolStats : {}",  connectionPoolStats);
} else {
System.out.println("Connection Pool Metrics are not available.");
}
Вопрос:
Почему пул соединений R2DBC выделяет 20 соединений и не соответствует ожидаемым 11?

Подробнее здесь: https://stackoverflow.com/questions/793 ... ient-max-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»