0

一部のページのカウンターを作成する必要があります。そこで、 Counter という名前のドメインを作成します。

class Counter {
  java.sql.Date date;
  Member member;
  int count;
  int submit;

  //setter and getter...
}

Count はこのページが開いた回数、submit はフォーム (お問い合わせフォームの一種) が送信された回数です。

そして、 CounterService という名前のサービスを作成しました:

class CounterService {
  List counters;

  def load() {
    counters = Counter.findAllByDate(new java.sql.Date(System.currentTimeMillis()));
  }

  def increaseCount(Member member) {
    counters.each { 
      if(it.member.id = member.id) it.setCount(it.count + 1);
    }
  }

  //the rest of the code...
}

Quartz ジョブを使用して、1 時間ごとにカウンターをデータベースに保存します。

このカウンター変数はマルチスレッドセーフだと思いますか? CounterService は多くの Controller で呼び出されるためです。サーバーを起動する前に load を呼び出す必要がありますが、どこで呼び出すべきかわかりません。どこで load() を呼び出すべきかについて何か提案はありますか? それとも、ページ カウンターのより良い解決策でしょうか?

4

1 に答える 1

0

なぜあなたはを使用していjava.sql.Dateますか?Plainjava.util.Dateは、より少ないコード オーバーヘッドで同じことを行うことができます。

私はこれにプレーンMapを使用しません。私はむしろ休止状態のキャッシュを使用したいと思います:

Counter counter = Counter.findByDate( someDate, [ cache:true ] );

オブジェクトがキャッシュに5分または10分保持されるようにします(デフォルトのehcache-settingsごとに、値を正確に覚えていないでください)

別のオプションは、一度にすべてのカウンターが本当に必要な場合はConcurrentHashMap、キャッシュに使用することです。これにより、スレッドセーフが強制されます。

class CounterService {
  ConcurrentHashMap counters
  ....
}
于 2014-02-17T10:07:19.060 に答える