我正在开发一个使用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" } }
}
这种方法有效,但我不确定它是否会一直有效,这是不是很糟糕的做法等等 .
1 回答
同步阻塞API的问题是每个API调用都会阻塞一个线程 . 根本无法解决它,协同程序与否 .
您的方法与提供异步适配器到阻止API的方法一样好 .
但请考虑以下事项:
您可能希望将
async { repository.findAll() }
和类似的阻塞调用限制在专用的固定ThreadPool / Dispatcher中 . 虽然协同程序很便宜,但请记住,repository.findAll()
阻止实际的底层线程,并且您不想耗尽CommonPool
中的所有线程(默认情况下由async
使用) .这是一种有用的做法,因为您限制了线程/同时阻塞调用的数量 . 如果您的固定池在某个时刻耗尽,那么传入的请求将被编辑,而不会阻塞线程,直到池中有可用的线程来处理它们 .