0

この質問が基本的に聞こえる場合はご容赦ください... 私は基本的に QA Eng です。(私の職業は開発者ではありません)、Grails を使用して、voip フレームワークをテストするためのツールを作成しています。私が作成したツールはうまく機能しますが、レポート ビュー (ダッシュボードなど) を作成するステップに到達すると、これを正しく行っていないと感じます。

問題は、ダッシュボード ページの読み込みに約 20 秒かかることです。このページを数秒でロードしたい私の利害関係者にとっては遅すぎます.

私が探しているのは、この gsp ページにデータを取り込むためのより良い方法を実装するための戦略です。

私が現在これをどのように行っているかは、おそらく可能な限り最悪の方法です...だから、これを達成するためのより良い方法を聞きたいと思っています. 私は、これをよりよく達成する方法について何を研究すべきかという戦略やアイデアをもっと探しています。

Grails アプリケーションは、基本的にいくつかの Quartz ジョブ (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 件あり、1 時間ごとにエラーを取得するクエリが 30 件あります。6 時間以上のエラーを取得するクエリが 30 件... そのため問い合わせが多いです。

値を返し、dashboard.gsp という GSP で、これらの返された値を取り込みます。

動作しますが...遅いです。では、どうすればこれをより良く行うことができますか?たくさんの質問がありますが、おそらくそれが最初の問題だと思います。

MySQL の代わりに H2 データベースを使用しています。

また...ページをキャッシュする必要がありますか? 現在、コントローラー/ページがロードされるたびにすべてのクエリが実行されます。

4

1 に答える 1

1

一般に、電話番号ごとに DB に複数回クエリを実行することは望ましくありません。これには 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 に答える