0

如果这个问题听起来很基本,请原谅......我基本上是一名质量检查工程师。(不是开发我的行业),我正在编写用于测试 voip 框架的工具 - 使用 Grails。我构建的工具效果很好,但是当我开始制作报告视图(如仪表板)时,我觉得我做的不对。

问题是,仪表板页面需要大约 20 秒才能加载。这对我的利益相关者来说太慢了,他们希望这个页面在几秒钟内加载。

所以我正在寻找的是一种策略来实施一种更好的方法来将数据拉入这个 gsp 页面。

我目前这样做的方式可能是最糟糕的方式......所以我希望听到更好的方式来实现这一点。我正在寻找更多关于我应该研究如何更好地实现这一目标的策略或想法。

grails 应用程序基本上通过一些石英作业(每 10 分钟运行一次)拨打电话号码,以验证电话运营商是否完成了通话——应用程序将它们标记为“通过”或“失败”,并在一段时间内获得“失败计数”时间(即 sprint 号在 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 数据库,而不是 MySQL。

另外...我应该缓存页面吗?目前,每次控制器/页面加载时,查询都会运行。

4

1 回答 1

1

通常,您不希望为每个电话号码多次查询数据库。您希望这对每个电话号码都有一个查询,或者当然不是单独的查询。我不熟悉 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
于 2013-11-01T05:41:26.197 回答