在 Slick 中等待语句执行完成

Posted

技术标签:

【中文标题】在 Slick 中等待语句执行完成【英文标题】:Await statement execution completion in Slick 【发布时间】:2017-09-21 11:29:43 【问题描述】:

在我的测试中,我有一些在测试级别没有公开为Futures 的数据库操作。有时,我的测试运行得足够快,以至于我的清理中的close() 发生在这些数据库操作完成之前,然后我得到了丑陋的错误。有没有办法检测有多少语句在进行中或以其他方式推迟close()

【问题讨论】:

【参考方案1】:

当您执行查询时,您会得到Future[A],其中A 是查询的结果。

您可以使用Future.sequence() 组合所有查询以获得单个未来composedFuture,当您的所有查询都返回结果时,该composedFuture 将完成。

现在您可以使用composedFuture.map(_ => close()) 确保所有查询都已完成执行,然后关闭资源。

最好的选择是将动作公开为未来,然后组合它们。 否则,您可以输入Thread.sleep(someSensibleTime) 并希望您的未来在someSensibleTime 内完成,但这会使您的测试变得缓慢且容易出错。

【讨论】:

是的,问题是我的 API 需要返回两个 Futures 之一,让另一个查询是即发即弃的。我认为归根结底,我需要重新考虑那个 API。【参考方案2】:

我认为它可能依赖于数据库而不是简单依赖。

例如,mysql 技术允许您使用查询“show processlist”查看当前正在运行的查询,并采取相应的行动。

如果这不是一个选项,我想您可以轮询数据库以观察选定的副作用,然后关闭()?

【讨论】:

以上是关于在 Slick 中等待语句执行完成的主要内容,如果未能解决你的问题,请参考以下文章

等待未来函数完成其执行

javascript:循环中如何等待方法完成了再继续?

在 Slick 3 的事务中执行非数据库操作

在 vue 上运行语句之前如何等待异步完成?

Android activity等待service数据后再执行

Main 方法在执行过程中等待线程完成。为啥?