7

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

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

我的问题是:

是否可以这样使用:

  • CrudRepository阻塞的休闲
  • 使用 corountines 并将所有内容返回为的服务Mono

服务示例代码:

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" } }
}

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

4

1 回答 1

8

同步阻塞 API 的问题是每个 API 调用都会有一个线程被阻塞。根本没有办法绕过它,不管是否有协程。

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

但是,请考虑以下事项:

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

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

于 2018-05-27T19:00:01.800 回答