在 Slick 中等待语句执行完成
Posted
技术标签:
【中文标题】在 Slick 中等待语句执行完成【英文标题】:Await statement execution completion in Slick 【发布时间】:2017-09-21 11:29:43 【问题描述】:在我的测试中,我有一些在测试级别没有公开为Future
s 的数据库操作。有时,我的测试运行得足够快,以至于我的清理中的close()
发生在这些数据库操作完成之前,然后我得到了丑陋的错误。有没有办法检测有多少语句在进行中或以其他方式推迟close()
?
【问题讨论】:
【参考方案1】:当您执行查询时,您会得到Future[A]
,其中A
是查询的结果。
您可以使用Future.sequence()
组合所有查询以获得单个未来composedFuture
,当您的所有查询都返回结果时,该composedFuture
将完成。
现在您可以使用composedFuture.map(_ => close())
确保所有查询都已完成执行,然后关闭资源。
最好的选择是将动作公开为未来,然后组合它们。
否则,您可以输入Thread.sleep(someSensibleTime)
并希望您的未来在someSensibleTime
内完成,但这会使您的测试变得缓慢且容易出错。
【讨论】:
是的,问题是我的 API 需要返回两个Future
s 之一,让另一个查询是即发即弃的。我认为归根结底,我需要重新考虑那个 API。【参考方案2】:
我认为它可能依赖于数据库而不是简单依赖。
例如,mysql 技术允许您使用查询“show processlist”查看当前正在运行的查询,并采取相应的行动。
如果这不是一个选项,我想您可以轮询数据库以观察选定的副作用,然后关闭()?
【讨论】:
以上是关于在 Slick 中等待语句执行完成的主要内容,如果未能解决你的问题,请参考以下文章