Реактор и транзакция базы данных - PullRequest
1 голос
/ 18 октября 2019

Я работаю над проектом 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>
...