2014-02-17 10 views
0

일부 페이지에 대한 카운터를 생성해야합니다. 그래서 내가 도메인 이름 카운터를 만들 :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()를 어디에 호출해야하는지 제안 해 주시겠습니까? 아니면 더 나은 페이지 카운터 솔루션일까요?

답변

0

java.sql.Date을 왜 사용하고 있습니까? Plain java.util.Date은 적은 코드 오버 헤드로 동일한 작업을 수행 할 수 있습니다.

일반용 Map은 사용하지 않습니다. 5 또는 10 분 긴

또 다른 옵션이 될 것이다 (기본으로 Ehcache-설정에 따라, 정확하게 값을 기억하지 않는다) 그래서

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

객체가 캐시에 보관됩니다 : 나는 오히려 최대 절전 모드 캐싱을 사용 java.sql.Date하지 않는 것처럼

class CounterService { 
    ConcurrentHashMap counters 
    .... 
} 
+0

java.util.Date 시간 포함 : 당신이 정말로 모든 카운터를 필요로하는 경우, 한 번에 스레드 안전성을 강화 않는, 캐싱 ConcurrentHashMap을 사용하는 것입니다. 감사합니다. 귀하의 제안에 따라 ConcurrentHashMap을 사용하겠습니다. 하지만 여전히 어디에서 load()를 호출해야합니까? –

+0

죄송합니다.지도가 아닌 목록이어야합니다. 목록에 질문을 편집했습니다. –

+0

예를 들어 java.util.concurrent.ConcurrentSkipListSet 사용 – injecteer