Код: Выделить всё
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 потоков.
- Один поток выполняет 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