没有 ReactiveCrudRepository 的 WebFlux 和 Kotlin 协程

WebFlux and Kotlin corountines without ReactiveCrudRepository

我正在开发一个使用 Kotlin、Spring Boot、Hibernate(所有最新版本)的项目,我想让它与 Spring 的 WebFlux 框架反应。

问题是我无法使用 ReactiveCrudRepository,因为 Web 应用程序必须使用 Oracle 数据库,因此必须使用 Hibernate。所以我想不出一种方法如何使用非阻塞访问 Oracle SQL 数据库(仅限免费框架)。

我的问题是:

可以这么用吗:

服务示例代码:

fun getAllLanguages(): Mono<Collection<ProgrammingLanguage>> = async { repository.findAll() }.asMono()

之后会有控制器:

fun listProgrammingLanguagesReactive() = mono(Unconfined) {
    service.also { logger.info { "requesting list of programming languages" } }
            .getAllLanguages()
            .also { logger.info { "responding with list of programming languages" } }
}

这种方法有效,但我不确定它是否会一直有效,以及这是否不是糟糕的做法等等。

同步阻塞的问题API是每次API调用都会阻塞一个线程。根本没有办法解决它,无论是否有协程。

您的方法与任何提供异步适配器以阻塞的方法一样好API。

但是,请考虑以下内容:

您可能希望将 async { repository.findAll() } 和类似的阻塞调用限制在专用的固定 ThreadPool/Dispatcher 中。虽然协程很便宜,但请记住,repository.findAll() 会阻塞实际的底层线程,并且您不想耗尽 CommonPool 中的所有线程(默认情况下由 async 使用)。

这是一种有用的做法,因为您限制了 threads/simultaneous 阻塞调用的数量。如果您的固定池在某个时候耗尽,那么传入的请求将被 suspended,不会阻塞线程,直到池中有可用的线程来处理它们。