Стиль реактивного программирования на устаревших базах данных - PullRequest
0 голосов
/ 02 января 2019

С помощью Spring Boot 2 можно ли кодировать в реактивном стиле (Mono, Flux и их операторы), но сохранить систему пула потоков JDBC?

Цель состоит в том, чтобы переключиться на драйверы R2DBC, когда онибудьте готовы к производству, не меняя уровни контроллеров и сервисов.

Большое спасибо!

Saveriu

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Я думаю, что вопрос, который вы задаете, немного не точный.Что такое устаревшие базы данных?Как вы упомянули JDBC, я объясню свою точку зрения о базах данных SQL и реактивном программировании.

Все базы данных SQL, которые я знаю, предоставляют вам механизм транзакций , поэтому, когда вы пишете в несколько таблиц и получаетеошибка на каком-то этапе ваши таблицы остаются чистыми.Что бы вы сделали, если бы вы назвали эти несколько вставок таблиц реактивным способом?Вместо отката транзакции вы должны написать код для удаления всех вставленных данных.Как мне кажется в начале 2019 года, все еще сложно применить модель реактивного программирования для баз данных SQL.Так что, если ваш домен полагается на транзакции, просто держитесь с реактивным.

Что ж, если вам нужно быть реактивным с JDBC ... Я бы предпочел запускать мои реактивные вещи в одном потоке, пока приложение JDBCв другом пуле потоков или даже в другом приложении.

Reactive имеет большое пространство для применения, но должен использоваться правильно.

0 голосов
/ 02 января 2019

Обычный способ решить эту проблему - обернуть эти синхронные типы возвращаемых значений Mono и запланировать работу с определенным Scheduler. Поскольку эта работа в основном включает блокировку ввода / вывода, Scheduler.elastic() является лучшим выбором здесь.

Вы можете заключить тип блокировки в Mono.fromCallable, Mono.fromSupplier, Mono.fromFuture в зависимости от типа возврата, который вы получаете от API блокировки. Вы также можете использовать Mono.fromRunnable, если хотите просто узнать, когда задача выполнена, и получить пустое значение.

Ознакомьтесь с Справочной документацией Reactor об этом .

Обратите внимание, что выполняя это, вы будете планировать работу с пулом потоков и потеряете часть преимуществ времени выполнения за неблокирующим вводом / выводом. Другой способ миграции - продолжить использование Spring MVC (, который поддерживает реактивные типы возврата ) и использовать реактивные типы, где это возможно. Вы сможете использовать реактивные типы везде, где можете, и вам не нужно будет оборачивать вещи повсюду.

...