Kotlin与Spring JPA阻塞存储库的协同程序

lmyy7pcs  于 2023-01-05  发布在  Kotlin
关注(0)|答案(1)|浏览(236)

我尝试在“老式”Spring JPA仓库中使用Kotlin协同程序,我创建了一个新的协同程序作用域,并以“异步”方式运行所有JPA调用,我发现即使使用非React式JDBC,我也提高了吞吐量。
但是我想知道,可能在Spring JPA仓库中存在一些协程 Package 器?用反射和Spring“魔法”创建的东西?

gk7wooem

gk7wooem1#

首先,我想澄清一件事,以防止可能出现的混乱:如果您正在使用SpringDataJPA,那么您应该知道这个框架使用JDBC驱动程序,这实际上是一个阻塞API,这意味着所有的数据库调用都会阻塞调用线程,直到整个结果完成并准备好被使用为止。有了这些知识,我假设您正在使用suspend函数和运行在Dispatcher.IO上的协程来进行此类调用。这个调度器为每个调用提供一个线程(据我所知,它最多可以扩展到64个线程),而这个线程在进行数据库调用时实际上会阻塞,这意味着协程和suspend在这种情况下除了将阻塞调用切换到另一个线程(最终会被阻塞)之外没有任何魔力。
也许您应该看看r2dbc(React式SQL驱动程序),并使用Spring Data中的CoroutineCrudRepository<T, ID>,而不是使用标准的JpaRepostitory<T, ID>
CoroutineCrudRepository<T, ID>具有suspend的所有方法,这意味着您可以使用它们来创建“真正的”异步API,而完全不会阻塞。
然而,r2dbc可能不适合您的用例,因为它有很多限制,如Map关系、缓存等。

相关问题