在 Slick 中等待语句执行完成
Await statement execution completion in Slick
在我的测试中,我有一些数据库操作在测试级别没有公开为 Future
s。有时,我的测试 运行 足够快,以至于我的清理 close()
发生在这些数据库操作完成之前,然后我得到了丑陋的错误。有没有办法检测有多少语句正在运行或以其他方式推迟 close()
?
当您执行查询时,您会得到 Future[A]
,其中 A
是查询的结果。
您可以使用 Future.sequence()
组合所有查询以获得单个未来 composedFuture
,当您的所有查询都返回结果时,它将完成。
现在您可以使用 composedFuture.map(_ => close())
来确保所有查询都已完成执行,然后关闭资源。
最好的选择是将动作公开为未来,然后组合它们。
否则,您可以输入 Thread.sleep(someSensibleTime)
并希望您的未来在 someSensibleTime
内完成,但这会使您的测试缓慢且容易出错。
我认为它可能依赖于数据库而不是依赖于 slick-dependent。
例如,mysql 技术允许您查看当前 运行 查询与查询 "show processlist",并采取相应的行动。
如果那不是一个选项,我想您可以轮询数据库以观察选定的副作用,然后关闭()?
在我的测试中,我有一些数据库操作在测试级别没有公开为 Future
s。有时,我的测试 运行 足够快,以至于我的清理 close()
发生在这些数据库操作完成之前,然后我得到了丑陋的错误。有没有办法检测有多少语句正在运行或以其他方式推迟 close()
?
当您执行查询时,您会得到 Future[A]
,其中 A
是查询的结果。
您可以使用 Future.sequence()
组合所有查询以获得单个未来 composedFuture
,当您的所有查询都返回结果时,它将完成。
现在您可以使用 composedFuture.map(_ => close())
来确保所有查询都已完成执行,然后关闭资源。
最好的选择是将动作公开为未来,然后组合它们。
否则,您可以输入 Thread.sleep(someSensibleTime)
并希望您的未来在 someSensibleTime
内完成,但这会使您的测试缓慢且容易出错。
我认为它可能依赖于数据库而不是依赖于 slick-dependent。
例如,mysql 技术允许您查看当前 运行 查询与查询 "show processlist",并采取相应的行动。
如果那不是一个选项,我想您可以轮询数据库以观察选定的副作用,然后关闭()?