Почему пул соединений R2DBC выделяет MAX соединений, когда они не нужны приложениюJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Почему пул соединений R2DBC выделяет 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
Мое приложение имеет два рабочих процесса:
A. Создание данных для обработки – используется 1 поток.
  • Этот процесс принимает сообщение от SQS и использует его для подготовки данных.
    < /li>
    МетодprocessMessage — это реактивный метод, который обрабатывает сообщение и генерирует данные в реактивном потоке. Использовал .block, поскольку я использовал режим подтверждения сеанса как CLIENT_ACKNOWLEDGE

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

    myConsumerService.processMessage(message).block();
Б. Обработка данных — использует 10 потоков
  • Один поток обрабатывает эти 3 операции одну за другой.

    Каждая операция 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();
    }
    }
    
Я использовал режим ведения журнала DEBUG для R2DBC(

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

logging.level.io.r2dbc.pool=DEBUG
), и он показывает, что соединение установлено непосредственно перед операцией MySQL и освобождено сразу после операции MySQL.
Ожидаемый результат: Предполагается, что приложение будет использовать максимум 11 подключений, поэтому выделенных соединений R2DBC должно быть 11.
Фактический результат: журналы показывают, что 20 подключений выделены пулом соединений R2DBC.
Вот журнал, который я наблюдал:
ConnectionPoolStats: выделено: 20, получено: 1, в режиме ожидания: 0, в ожидании: 9
Для справки я использовал следующий код для получения ConnectionPoolStats:< /p>

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

 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.");
}
Вопросы:
  • Почему все соединения отображаются как выделенные, а приложение — нет требуется в любой момент времени?
  • Есть ли вероятность того, что я приведу к какому-либо необычному состоянию соединения?
Спасибо вам заранее.

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

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

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

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

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

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

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