首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ConnectionIO事务中的并行操作

ConnectionIO事务中的并行操作
EN

Stack Overflow用户
提问于 2022-04-12 15:26:29
回答 1查看 82关注 0票数 0

因此,我有一个程序,在这个程序中,我从数据库中获取文件路径列表,删除文件系统上的文件,最后从数据库中删除文件路径。我将所有操作放入事务中,以确保从数据库中删除路径,当文件系统中的所有文件都被删除时。

就像这样

代码语言:javascript
复制
val result = for {
deletePath <- (fr""" select path from files""").query[String].stream //Stream[doobie.ConnectionIO,String]
_ <- Stream.eval(AsyncConnectionIO.liftIO(File(deletePath).delete()) //Stream[doobie.ConnectionIO,Unit]
_ <- Stream.eval(sql"delete from files where path = ${deletePath}".withUniqueGeneratedKeys) 
}

result.compile.drain.transact(transactor)

不幸的是,文件系统是分布式的,这意味着单独的操作是缓慢的,但它允许同时进行多个操作。

因此,我的问题是,如何在这里并行文件系统删除操作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-12 15:46:11

是的,你可以的。只需使用适当的组合器,而不是for语法。

代码语言:javascript
复制
val result =
  (fr""" select path from files""")
    .query[String]
    .stream
    .parEvalMapUnordered(maxConcurrent = 64) { deletePath =>
      AsyncConnectionIO.liftIO(File(deletePath).delete()) >>
      sql"delete from files where path = ${deletePath}".withUniqueGeneratedKeys
    }

result.compile.drain.transact(transactor)

记住将maxConcurrent参数更改为对您的用例有意义的东西。

(我无法测试代码,所以它可能有一些排字)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71845341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档