2013-11-01 30 views
0

请原谅这个问题听起来是否基本......我基本上是QA Eng。 (不是我的交易),我正在编写用于测试voip框架的工具 - 使用Grails。我建立的工具非常有用,但是当我开始制作报告视图(如Dashboard)时,我觉得我只是没有做到这一点。需要Grails策略来处理填充GSP页面的许多查询

问题是,仪表板页面需要大约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] 

控制板页面显示像数据:每6侯 合格/不合格,每1个小时的故障,故障rs,每24小时发生故障

所以,如果我有30个电话号码由运营商打电话:我有30个查询获得通过/失败,30个其他查询失败小时30个查询获得故障超过6小时... 30个查询以24小时获得失败。所以这是很多的疑问。

我返回值并在一个名为dashboard.gsp的GSP中引入这些返回的值。

它可以工作,但是...很慢。那我该如何做得更好呢?我有很多疑问,我认为这可能是第一个问题。

我使用的是H2数据库,而不是MySQL。

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

回答

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 
+0

谢谢吉姆。所以基本上我应该努力减少访问数据库(即结合查询)。听起来不错。我应该遵守其他最佳做法吗?查询触发页面刷新是否安全? – continuousqa

+0

鉴于您希望查看以小时为单位进行的更改,您可能希望在每次刷新时都启动查询。最佳实践方面,您一定希望减少对数据库的调用次数,但如果您想查看实时更改,则可能不希望缓存很多内容。缓存的数量和缓存的位置通常取决于数据的易变性。事情很少改变,你可以缓存在页面级别,改变很多你想要在数据库级缓存,并有一个依赖项来检查什么时候进行更改。希望有所帮助 –