查询次数限制

每个控制器或API端点允许执行最多100个SQL查询,在测试环境中,当超过这个阈值时,我们将引发错误。

解决失败测试

当一个测试因为执行了超过100个SQL查询而失败时,这个问题有两种解决方案:

  1. 减少执行的SQL查询的数量。
  2. 将控制器或API端点列入白名单。

只有在现有控制器或端点有问题时,才应该使用白名单,因为在这种情况下,减少SQL查询的数量可能会花费很多精力。新添加的控制器和端点不允许执行超过100个SQL查询,并且不会对此规则产生例外。如果如果需要大量的SQL查询来执行某些工作,那么最好让Sidekiq来执行这些工作,而不是直接在web请求中执行这些工作。

白名单

万一你要将控制器列入白名单,首先需要创建一个问题。这个问题应该(最好在标题中)提到控制器或端点,并包括适当的标签(数据库性能,以及至少一个团队特定的标签,例如讨论).

一旦问题产生,您就可以将有问题的代码列入白名单。对于Rails控制器,最好创建一个before_action尽可能早地运行的钩子。被调用的方法应该依次调用Gitlab:: QueryLimiting。白名单('issue URL here')。例如:

MyController<程序控制器before_action: whitelist_query_limiting只有::显示]def指数#……结束def显示#……结束defwhitelist_query_limitingGitlab::QueryLimiting白名单“https://gitlab.com/gitlab-org/..”。结束结束

通过使用before_action您不必修改相关的控制器方法,从而减少合并冲突的可能性。

不幸的是,对于Grape API端点,没有可靠的方法在特定端点之前运行钩子。这意味着你必须像这样直接将白名单调用添加到端点中:

得到“/项目/:id / foo”Gitlab::QueryLimiting白名单“……”#……结束
Baidu
map