我有一个运行一些数据库查询的Web应用程序来满足某些请求。我正在使用aka http和Slick(与HikariCP)。我使用进行理解来确保这些查询并行运行。但是,当我运行它时,我看到只有一个连接用于运行所有查询。我想要的是在数据库上并行运行的查询,即使用单独的连接。
eventFilter : DBIO[] = ??
vendorFilter : DBIO[] = ??
val flags = for {
event <- eventFilter
vendor <- vendorFilter
} yield (event, vendor)
这里eventFilter和vendorFilter是将在不同线程中运行的数据库操作。但是,它们使用与数据库相同的连接。我想使用单独的连接,以便查询可以实际并行运行。我正在使用HikariCP,它在空闲状态下有20个连接。我希望我可以使用它们。
我的理解是否正确?任何关于如何实现这一点的想法。 Hikari配置中的任何更改都可以帮助实现此更改。另请指出与此方法相关的任何缺点。感谢。
答案 0 :(得分:1)
请记住,for comprehension只是map
和flatMap
的应用程序的语法糖。为了理解而去了:
val flags = eventFilter.flatMap { event =>
vendorFilter.map { vendor =>
(event, vendor)
}
}
来自flatMap
的文档:
使用成功执行此操作生成的结果来计算,然后按顺序运行下一个操作。如果此操作,计算或计算操作失败,则生成的操作将失败。
所以vendorFilter
在eventFilter
完成之后才会被执行。
如果您希望两个过滤器并行执行,那么您需要以下内容:
val eventFut = db.run(eventFilter)
val vendorFut = db.run(vendorFilter)
eventFut.zip(vendorFut)