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