Kotlin协程与Spring JPA块存储库



我正在尝试使用"老式" kotlin协程;Spring JPA存储库。我创建了一个新的协程范围,并以"异步"方式运行所有JPA调用。我发现即使使用非响应式JDBC,我也可以提高吞吐量。

但我想知道,可能存在一些协程包装在Spring JPA储存库?用反射和春天"魔力"创造出来的东西?

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

也许你应该看看r2dbc(响应式SQL驱动程序),并使用CoroutineCrudRepository<T, ID>从Spring Data而不是使用标准的JpaRepostitory<T, ID>

CoroutineCrudRepository<T, ID>具有suspend的所有方法,这意味着您可以使用它们来创建"真正的">

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

<标题>

更新:据我所知,没有spring方法可以自动包装阻塞调用,但是您可以看看这个库

最新更新