使用Spring Boot 2,是否可以采用反应式(Mono,Flux及其运算符)进行编码,但保留JDBC线程池系统?
目标是在可以进行生产的情况下切换到R2DBC驱动程序,而无需更改控制器和服务层。
非常感谢!
Saveriu
答案 0 :(得分:0)
解决该问题的常用方法是用Mono
包装这些同步返回类型并安排在特定Scheduler
上工作的日期。由于这项工作主要涉及阻塞I / O,因此Scheduler.elastic()
是这里的最佳选择。
您可以根据从阻塞API获取的返回类型,用Mono.fromCallable
,Mono.fromSupplier
,Mono.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应用程序。
反应堆有很大的应用空间,但应正确使用。