Kotlin 协程与 Spring JPA 阻塞存储库

Pav*_*tam 5 spring jdbc spring-data-jpa kotlin kotlin-coroutines

我正在尝试将 kotlin 协程与“旧式”Spring JPA 存储库一起使用。我创建一个新的协程范围并在“异步”中运行所有 JPA 调用。我发现,即使使用非反应式 JDBC,我的吞吐量也有所提高。

但我想知道,Spring JPA 存储库上可能存在一些协程包装器吗?用反射和Spring“魔法”创建的东西?

ker*_*ter 3

首先,我想澄清一件事,以防止可能的混淆:如果您使用 Spring Data JPA,那么您应该知道该框架使用 JDBC 驱动程序底层,这实际上是一个阻塞 API,这意味着所有数据库调用都会调用线程会阻​​塞,直到总结果完成并准备好使用。有了这些知识,我假设您正在使用suspend带有协程的函数Dispatcher.IO来进行此类调用。该调度程序为每次调用提供一个线程(据我所知,它最多可扩展至 64 个线程)。该线程实际上在进行数据库调用时会阻塞,这意味着协程suspend在这种情况下不会产生任何魔法,除了将阻塞调用切换到另一个线程(最终将被阻塞)。

也许您应该看一下 r2dbc(反应式 SQL 驱动程序)并使用CoroutineCrudRepository<T, ID>Spring Data 而不是使用标准JpaRepostitory<T, ID>.

CoroutineCrudRepository<T, ID>拥有所有方法,suspend这意味着您可以使用它们来创建“真正的”异步 API,而根本不会阻塞。

然而,r2dbc 可能不适合您的用例,因为它有很多限制,例如映射关系、缓存等。

更新:

据我所知,没有 Spring-way 来自动包装阻塞调用,但是你可以看看这个库