没有 ReactiveCrudRepository 的 WebFlux 和 Kotlin 协程
WebFlux and Kotlin corountines without ReactiveCrudRepository
我正在开发一个使用 Kotlin、Spring Boot、Hibernate(所有最新版本)的项目,我想让它与 Spring 的 WebFlux 框架反应。
问题是我无法使用 ReactiveCrudRepository
,因为 Web 应用程序必须使用 Oracle 数据库,因此必须使用 Hibernate。所以我想不出一种方法如何使用非阻塞访问 Oracle SQL 数据库(仅限免费框架)。
我的问题是:
可以这么用吗:
- 休闲
CrudRepository
阻塞
- 使用协程和 returns 一切如
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" } }
}
这种方法有效,但我不确定它是否会一直有效,以及这是否不是糟糕的做法等等。
同步阻塞的问题API是每次API调用都会阻塞一个线程。根本没有办法解决它,无论是否有协程。
您的方法与任何提供异步适配器以阻塞的方法一样好API。
但是,请考虑以下内容:
您可能希望将 async { repository.findAll() }
和类似的阻塞调用限制在专用的固定 ThreadPool/Dispatcher 中。虽然协程很便宜,但请记住,repository.findAll()
会阻塞实际的底层线程,并且您不想耗尽 CommonPool
中的所有线程(默认情况下由 async
使用)。
这是一种有用的做法,因为您限制了 threads/simultaneous 阻塞调用的数量。如果您的固定池在某个时候耗尽,那么传入的请求将被 suspend
ed,不会阻塞线程,直到池中有可用的线程来处理它们。
我正在开发一个使用 Kotlin、Spring Boot、Hibernate(所有最新版本)的项目,我想让它与 Spring 的 WebFlux 框架反应。
问题是我无法使用 ReactiveCrudRepository
,因为 Web 应用程序必须使用 Oracle 数据库,因此必须使用 Hibernate。所以我想不出一种方法如何使用非阻塞访问 Oracle SQL 数据库(仅限免费框架)。
我的问题是:
可以这么用吗:
- 休闲
CrudRepository
阻塞 - 使用协程和 returns 一切如
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" } }
}
这种方法有效,但我不确定它是否会一直有效,以及这是否不是糟糕的做法等等。
同步阻塞的问题API是每次API调用都会阻塞一个线程。根本没有办法解决它,无论是否有协程。
您的方法与任何提供异步适配器以阻塞的方法一样好API。
但是,请考虑以下内容:
您可能希望将 async { repository.findAll() }
和类似的阻塞调用限制在专用的固定 ThreadPool/Dispatcher 中。虽然协程很便宜,但请记住,repository.findAll()
会阻塞实际的底层线程,并且您不想耗尽 CommonPool
中的所有线程(默认情况下由 async
使用)。
这是一种有用的做法,因为您限制了 threads/simultaneous 阻塞调用的数量。如果您的固定池在某个时候耗尽,那么传入的请求将被 suspend
ed,不会阻塞线程,直到池中有可用的线程来处理它们。