【发布时间】:2021-07-13 21:29:12
【问题描述】:
我正在做一个新的项目,目标是更深入地学习 Kotlin,但我在弄清楚如何将 Kotlin 风格的并发与没有考虑使用协程编写的代码混合使用时遇到了一些麻烦(JOOQ in this案子)。下面的函数在我的一个 DAO 中,在那个映射块中,我想更新数据库中的一堆行。在这个具体的例子中,更新实际上依赖于前一个完成,所以它需要按顺序完成,但我感兴趣的是如何修改这段代码以并行运行更新,因为毫无疑问会使用我有不需要按顺序运行的情况。
suspend fun updateProductChoices(choice: ProductChoice) = withContext(Dispatchers.IO) {
ctx().transaction { config ->
val tx = DSL.using(config)
val previousRank = tx.select(PRODUCT_CHOICE.RANK)
.from(PRODUCT_CHOICE)
.where(PRODUCT_CHOICE.STORE_PRODUCT_ID.eq(choice.storeProductId))
.and(PRODUCT_CHOICE.PRODUCT_ID.eq(choice.productId))
.fetchOne(PRODUCT_CHOICE.RANK)
(previousRank + 1..choice.rank).map { rank ->
tx.update(PRODUCT_CHOICE)
.set(PRODUCT_CHOICE.RANK, rank - 1)
.where(PRODUCT_CHOICE.PRODUCT_ID.eq(choice.productId))
.and(PRODUCT_CHOICE.RANK.eq(rank))
.execute()
}
}
}
最好的方法是将transaction lambda 包装在runBlocking 中,并将每个update 包装在async 中,然后awaitAll 结果?还可能值得注意的是,JOOQ 查询支持executeAsync(),它返回一个CompletionStage。
【问题讨论】:
标签: kotlin kotlin-coroutines jooq