通过Slick和Hikari

时间:2018-01-03 06:46:35

标签: akka database-connection slick akka-http hikaricp

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

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

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

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

我的理解是否正确?任何关于如何实现这一点的想法。 Hikari配置中的任何更改都可以帮助实现此更改。另请指出与此方法相关的任何缺点。感谢。

1 个答案:

答案 0 :(得分:1)

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

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

来自flatMap的文档:

  

使用成功执行此操作生成的结果来计算,然后按顺序运行下一个操作。如果此操作,计算或计算操作失败,则生成的操作将失败。

所以vendorFiltereventFilter完成之后才会被执行。

如果您希望两个过滤器并行执行,那么您需要以下内容:

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

eventFut.zip(vendorFut)