Проблема с пулом соединений с Quarkus Panache Reactive и MySQLJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Проблема с пулом соединений с Quarkus Panache Reactive и MySQL

Сообщение Anonymous »

Я использую Quarkus + Panache Reactive + MySQL для своего проекта. Поскольку он реактивный, мой пул соединений использует Пул Vertx SQL. Я также включил Метрики для отслеживания состояния системы.
У меня есть такое запланированное задание:

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

@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();
}
Где xxxxClient.getData запрашивает внешний API и сохраняет возвращенные данные в базу данных. Он работает стабильно в течение длительного времени.
Проблема
Однако недавно этот внешний 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.
Когда я проверил данные мониторинга в Prometheus, я обнаружил:
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
Ответить

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

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

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

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

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