Я работаю над проектом Java, использующим весеннюю загрузку в качестве контейнера, и чтобы указать, что соединение с базой данных Oracle не является реактивным, мы решили использовать реактор для распараллеливания операций, таких как вставка или обновление, которые не зависят отдруг с другом (между ними нет связей с внешними ключами).
Иногда во время выполнения ParallelFlux он теряет соединение:
org.springframework.jdbc.CannotGetJdbcConnectionException: не удалось получитьJDBC Connection;Вложенное исключение - java.sql.SQLTransientConnectionException: HikariPool-1 - Соединение недоступно, время запроса истекло после 1001 мс.
или просто оно не находит данные, сохраненные до вызова ParallelFlux, но не зафиксированные.
Это случайное поведение, использующее те же данные, что и для ввода.
Что меня интересует, так это то, является ли транзакция базы данных поточно-безопасной и обрабатывает ли ParallelFlux ее правильно.
Может кто-нибудь объяснить мне, как транзакция базы данных передается при весенней загрузке в реактори как последние справились?
РЕДАКТИРОВАТЬ :
Я делал другие тесты. Я наблюдал за соединением в БД и заметил, что исходная транзакция, в которой данные сохраняются перед блоком ParallelFlux, приостанавливается, и для каждого вызова метода внутри блока ParallelFlux новое соединение открыто и ожидает исходноеодин до конца. Все это закончилось блокировкой в Oracle, а затем стало причиной org.springframework.jdbc.CannotGetJdbcConnectionException из-за насыщения соединения.
Зная это, я изменил аннотацию @Transactional метода, вызываемого ParallelFlux, на:
@Transactional(propagation = Propagation.REQUIRED)
В результате это привело к исключению org.springframework.jdbc.CannotGetJdbcConnectionException в первомвызов метода, как и ожидалось.
смена тегов
Кто-то попросил удалить «реактор» из списка тегов этого вопроса, но это не правильно,потому что я использую Reactor, а не spring-webflux, и эта часть находится в бэкэнде, а не внутри службы REST.
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-core</artifactId>
<type>jar</type>
</dependency>