일부 페이지에 대한 카운터를 생성해야합니다. 그래서 내가 도메인 이름 카운터를 만들 :Grails 페이지 카운터
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...
}
나는 시간당 석영 작업을 사용하여 데이터베이스에 대한 카운터를 절약 할 수 있습니다.
이 카운터 변수가 다중 스레드 안전하다고 생각하십니까? 왜냐하면 CounterService는 많은 컨트롤러에서 호출되기 때문입니다. 서버가 시작되기 전에 load를 호출해야하며 어디에서 호출해야하는지 알 수 없습니다. load()를 어디에 호출해야하는지 제안 해 주시겠습니까? 아니면 더 나은 페이지 카운터 솔루션일까요?
java.util.Date 시간 포함 : 당신이 정말로 모든 카운터를 필요로하는 경우, 한 번에 스레드 안전성을 강화 않는, 캐싱
ConcurrentHashMap
을 사용하는 것입니다. 감사합니다. 귀하의 제안에 따라 ConcurrentHashMap을 사용하겠습니다. 하지만 여전히 어디에서 load()를 호출해야합니까? –죄송합니다.지도가 아닌 목록이어야합니다. 목록에 질문을 편집했습니다. –
예를 들어 java.util.concurrent.ConcurrentSkipListSet 사용 – injecteer