Grails策略需要处理填充GSP页面的许多查询

时间:2013-11-01 04:22:35

标签: sql grails gsp

如果这个问题听起来很基本,请原谅......我基本上是QA Eng。 (不是我的交易),我正在编写用于测试voip框架的工具 - 使用Grails。我构建的工具效果很好,但是当我进入报表视图(如仪表板)的步骤时,我觉得我只是没有做到这一点。

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

所以我正在寻找的是一种实现更好的方法将数据提取到此gsp页面的策略。

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

grails应用程序基本上通过一些石英作业拨打电话号码(每10分钟运行一次)来验证电话运营商是否完成了呼叫 - 应用程序将其标记为“通过”或“失败”以及获取“失败计数”在一段时间内(即短跑号码在1小时内失败1次,在6小时内失败3次,在24小时内失败10次等)

对于Dashboard控制器/页面,在类中我有很多这样的查询:

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。

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

1 个答案:

答案 0 :(得分: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