0

我需要为某些页面创建一个计数器。所以我创建了一个名为 Counter 的域:

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

  //setter and getter...
}

计数是这个页面打开了多少次,提交是提交了多少次表单(联系表单的种类)。

我创建了一个名为 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 作业每小时将计数器保存到数据库中。

你认为这个计数器变量是多线程安全的吗?因为 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 回答