遗留数据库上的反应式编程风格

时间:2019-01-02 10:30:46

标签: spring-boot spring-data spring-webflux project-reactor

使用Spring Boot 2,是否可以采用反应式(Mono,Flux及其运算符)进行编码,但保留JDBC线程池系统?

目标是在可以进行生产的情况下切换到R2DBC驱动程序,而无需更改控制器和服务层。

非常感谢!

Saveriu

2 个答案:

答案 0 :(得分:0)

解决该问题的常用方法是用Mono包装这些同步返回类型并安排在特定Scheduler上工作的日期。由于这项工作主要涉及阻塞I / O,因此Scheduler.elastic()是这里的最佳选择。

您可以根据从阻塞API获取的返回类型,用Mono.fromCallableMono.fromSupplierMono.fromFuture包装阻塞类型。如果您只想知道任务何时完成并获取空值,也可以使用Mono.fromRunnable

签出the Reactor reference documentation about this

请注意,这样做会在线程池上安排工作,并使非阻塞I / O失去部分运行时收益。要考虑的另一种迁移路径是继续使用Spring MVC(which supports reactive return types)并在可能的地方使用反应类型。您将可以在任何地方使用反应式类型,而无需在任何地方包装东西。

答案 1 :(得分:0)

我认为您提出的问题有点不准确。什么是旧版数据库?正如您提到的JDBC,我将解释有关SQL数据库和反应式编程的观点。

我知道的所有SQL数据库都为您提供事务机制,因此,当您写入少量表并在某些步骤出现错误时,您的表将保持干净。如果您将以响应方式调用这几张表插入,该怎么办?代替回滚事务,您必须编写一些代码来删除所有插入的数据。在我看来,2019年初开始,仍然很难将反应式编程模型应用于SQL数据库。因此,如果您的域依赖交易,则只需保持被动状态即可。

好吧,如果您必须与JDBC反应...我宁愿在一个线程中运行我的反应性内容,而在其他线程池甚至其他应用程序中运行JDBC应用程序。

反应堆有很大的应用空间,但应正确使用。