Grails Page Counter

时间:2014-02-17 08:47:00

标签: grails hitcounter grails-services

我需要为某些页面创建一个计数器。 所以我创建了一个名为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()? 或者,也许是一个更好的页面计数器解决方案?

1 个答案:

答案 0 :(得分:0)

您为什么使用java.sql.Date?普通java.util.Date可以用更少的代码开销来做同样的事情。

我不会使用普通Map。我宁愿使用hibernate缓存:

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

这样对象保存在缓存中5或10分钟(根据默认的ehcache设置,不记得确切的值)

另一种选择是,如果你真的需要所有计数器一次使用ConcurrentHashMap进行缓存,那就强制执行线程安全:

class CounterService {
  ConcurrentHashMap counters
  ....
}