如果这个问题听起来很基本,请原谅...我基本上是一个QA工程师(不是我的行业开发人员),我正在编写用于测试voip框架的工具 - 使用Grails。 我构建的工具效果很好,但是当我进入制作报表视图(如仪表板)的步骤时,我觉得我做得不对。
问题是,仪表板页面大约需要 20 秒才能加载。 对于我的利益相关者来说,这太慢了,他们希望这个页面在几秒钟内加载。
因此,我正在寻找一种策略,以实现一种更好的方法来将数据拉入此 gsp 页面。
我目前的做法可能是最糟糕的方式......所以我希望听到更好的方法来实现这一目标。 我正在寻找一种策略或关于我应该研究如何更好地实现这一目标的想法。
grails应用程序基本上通过一些石英作业(每10分钟运行一次)拨打电话号码,以验证电话运营商完成呼叫 - 该应用程序将它们标记为"通过"或"失败",并在一段时间内获得"失败计数"(即冲刺号码在1小时内失败1次,在6小时内失败3次, 24小时内10次,以此类推)
对于仪表板控制器/页面,在类中我有很多这样的查询:
def proxyRowCount24Hours = ProxyScan.executeQuery("select count(id) from ProxyScan where ipProxy='xxxxxxxxxxxx' AND dateCreated >= '"+within24Hours+"'",[max: 1])[0]
def proxyFailCount6Hours = ProxyFailCounter.executeQuery("select proxyFailCount from ProxyFailCounter where proxy='xxxxxxxxxxxxxxx' AND dateCreated >= '"+dateMinus6Hr+"' order by proxyFailCount desc",[max: 1])[0]
"仪表板"页显示的数据如下:通过/失败、每 1 小时故障、每 6 小时故障、每 24 小时故障
因此,如果我有 30 个运营商电话号码可以拨打:我有 30 个查询要通过/失败,30 个其他查询要按小时获得失败 30 个查询要获得超过 6 小时的失败......30 个查询在 24 小时内失败。 所以这是很多查询。
我返回这些值,并在一个名为dashboard.gsp的GSP中拉入这些返回的值。
它有效,但是...它很慢。 那么我怎样才能做得更好呢? 我有很多疑问,我想也许这是第一个问题。
我使用的是H2 db,而不是MySQL。
也。。。我应该缓存页面吗? 目前,每次加载控制器/页面时,查询都会运行。
通常,您不希望为每个电话号码多次查询数据库。 您希望每个电话号码都有一个查询,或者肯定不会单独查询。 我不熟悉 h2 或者我不记得 hql 的语法,但它是这样的:
SELECT ipProxy,
sum(case when (createdDate > sysdate - 1) then 1 else 0) as countsIn24hours,
sum(case when (date > sysdate - 1/4) then 1 else 0) as countsIn6hours,
sum(case when (date > sysdate - 1/2) then 1 else 0) as countsIn12hours
FROM ProxyFailCount
GROUP BY ipProxy