У меня есть такое запланированное задание:
Код: Выделить всё
@WithTransaction
@Scheduled(cron = "0 * * * * ?")
public Uni saveData() {
return xxxxClient.getData(appId, appSecret).onItem()
.transform(CommonResponse::data).onItem()
.transform(i -> {
List list = new ArrayList();
for (xxxxVo item : i) {
list.add(voToXxx(item));
}
return list;
}).onItem().transformToUni(
list -> xxxRepository.persist(list)
).replaceWithVoid();
}
Проблема
Однако недавно этот внешний API столкнулся с проблемой, когда один запрос возвращал почти 100 000 записей, в результате чего в моей таблице базы данных накапливалось более 30 миллионов записей, что приводило к серьезным проблемам с производительностью.
На этом этапе Quarkus продолжает выводить журналы:
Код: Выделить всё
io.vertx.sqlclient.ClosedConnectionException: Failed to read any response from the server,
the underlying connection may have been lost unexpectedly.
sql_pool_active: 20 (мой настроенный максимум)
sql_pool_waiting: 0
sql_pool_idle: 20
sql_pool_ratio: 0%
sql_pool_queue_size: постоянно растет с момента возникновения проблемы с API, достигая 60 000+
Даже после очистки соответствующей таблицы базы данных проблема сохраняется.
Анализ
Мой руководитель сказал мне, что проблема в том, что пакет запроса к базе данных слишком велик и превышает конфигурацию MySQL max_allowed_packet по умолчанию. Когда MySQL получает половину данных, он сбрасывает соединение. Однако пул соединений Quarkus об этом не знает, и последующие соединения продолжают использовать уже сброшенные соединения MySQL.
Я подумал об использовании конфигурации validation.query, доступной в Spring + Hibernate, которая выполняет оператор SQL перед запросом для проверки правильности соединения. Я проверил документацию и обнаружил, что драйверы JDBC поддерживают это, но реактивный драйвер, похоже, не имеет такой конфигурации.
Как проверить соединение перед выполнением запросов в реактивном драйвере? Или моя проблема вызвана не этим?
Подробнее здесь: https://stackoverflow.com/questions/798 ... -and-mysql
Мобильная версия