Scala 在Doobie中并行运行查询

Scala 在Doobie中并行运行查询,scala,functional-programming,scala-cats,doobie,Scala,Functional Programming,Scala Cats,Doobie,可以使用Doobie并行运行多个查询吗 我有以下(伪)查询: 但是,ConnectionIO找不到非空并行实例 错误:(107,54)找不到参数p的隐式值: 猫.非空平行[doobie.ConnectionIO,F]val结果= (程序(i1),程序(i2)).parMapN{case(a,b)=>a++b} 我是错过了一些明显的事情还是尝试了一些无法完成的事情? 谢谢您不能在连接中并行运行查询。但是,只要将它们转换为实际的运行时monad(只要它有一个并行实例),就可以了 例如,使用cats效

可以使用Doobie并行运行多个查询吗

我有以下(伪)查询:

但是,
ConnectionIO
找不到非空并行实例

错误:(107,54)找不到参数p的隐式值: 猫.非空平行[doobie.ConnectionIO,F]val结果= (程序(i1),程序(i2)).parMapN{case(a,b)=>a++b}

我是错过了一些明显的事情还是尝试了一些无法完成的事情?
谢谢

您不能在
连接中并行运行查询。但是,只要将它们转换为实际的运行时monad(只要它有一个并行实例),就可以了

例如,使用cats效果IO运行时monad:

def prepareForQuery(input: String): ConnectionIO[Unit] = ???
val gettAllResults: ConnectionIO[List[(String, BigDecimal)]] = ???
def program(input : String) : ConnectionIO[List[(String, BigDecimal)]] = for{
    _ <- prepareForQuery(input)
    r <- gettAllResults
  } yield r
你现在有了一个单子,它可以并行地做事情

val result: IO[List[(String, BigDecimal)]]] = 
    (program1IO, program2IO).parMapN{case (a,b) => a ++ b}

为了理解为什么
ConnectionIO
不允许并行工作,我将引用tpolat:

你不能同时运行康涅狄格州。这是一种描述连接使用的语言,它是一个线性操作序列

在IO中使用parMapN,可以同时运行两个东西,因为它们在不同的连接上运行

ConnectionIO没有parMapN,因为它没有(也不能)并行实例


这有用吗?您找到了这个问题的答案吗?可能是显而易见的,但如果您不需要在同一事务中同时运行两个查询,您可以先运行它们,然后运行结果的
IO
s。这个答案可能会有所帮助:
def prepareForQuery(input: String): ConnectionIO[Unit] = ???
val gettAllResults: ConnectionIO[List[(String, BigDecimal)]] = ???
def program(input : String) : ConnectionIO[List[(String, BigDecimal)]] = for{
    _ <- prepareForQuery(input)
    r <- gettAllResults
  } yield r
val program1IO: IO[List[(String, BigDecimal)]]] = program(i1).transact(xa)
val program2IO: IO[List[(String, BigDecimal)]]] = program(i2).transact(xa)
val result: IO[List[(String, BigDecimal)]]] = 
    (program1IO, program2IO).parMapN{case (a,b) => a ++ b}