2013-11-01 37 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

鑑於您希望查看以小時爲單位進行的更改,您可能希望在每次刷新時都啓動查詢。最佳實踐方面,您一定希望減少對數據庫的調用次數,但如果您想查看實時更改,則可能不希望緩存很多內容。緩存的數量和緩存的位置通常取決於數據的易變性。事情很少改變,你可以緩存在頁面級別,改變很多你想要在數據庫級緩存,並有一個依賴項來檢查什麼時候進行更改。希望有所幫助 –