通过 Slick 和 Hikari 使用每个查询的连接

Using a connection per query via Slick and Hikari

我有一个 Web 应用程序,它 运行 有一些数据库查询来满足一些请求。我正在使用 aka http 和 Slick(使用 HikariCP)。我使用 for comprehension 来确保这些查询 运行 并行。但是,当我 运行 它时,我看到只有 1 个连接用于 运行 所有查询。我想要的是在数据库上并行查询 运行,即使用单独的连接。

eventFilter : DBIO[] = ??
vendorFilter : DBIO[] = ??

val flags = for {
  event <- eventFilter
  vendor <- vendorFilter
} yield (event, vendor)

这里的 eventFilter 和 vendorFilter 是数据库操作,它们 运行 在不同的线程中。但是,他们使用相同的数据库连接。我想使用单独的连接,以便查询实际上可以 运行 并行。我正在使用在空闲状态下有 20 个连接的 HikariCP。我希望我可以使用它们。

我的理解对吗?关于如何实现这个的任何想法。 Hikari 配置中的任何更改可能有助于带来此更改。另请指出与此方法相关的任何缺点。谢谢

请记住,for 理解只是 mapflatMap 应用程序的语法糖。 for comprehension 脱糖为:

val flags = eventFilter.flatMap { event =>
  vendorFilter.map { vendor =>
    (event, vendor)
  }
}

来自 flatMap 的文档:

Use the result produced by the successful execution of this action to compute and then run the next action in sequence. The resulting action fails if either this action, the computation, or the computed action fails.

所以 vendorFilter 直到 eventFilter 完成后才执行。

如果你想让两个过滤器并行执行,你需要这样的东西:

val eventFut = db.run(eventFilter)
val vendorFut = db.run(vendorFilter)

eventFut.zip(vendorFut)