2014-02-17 47 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... 
} 

我要拯救每小時使用Quartz工作櫃檯數據庫。

您認爲這個計數器變量是多線程安全的嗎?因爲CounterService將在許多Controller中被調用。 我需要在服務器啓動之前調用加載,我不知道在哪裏調用它。 有什麼建議我應該在哪裏調用load()? 或者,也許,頁面計數器的更好的解決方案?

回答

0

爲什麼使用java.sql.Date?普通java.util.Date可以用較少的代碼開銷來做同樣的事情。

對此我不會使用普通的Map。我寧願用hibernate緩存:

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

以便對象保存在緩存5或10分鐘之久(每默認的Ehcache的設置,不記得確切的值)

另一種選擇是,如果你真的需要所有計數器一次是使用ConcurrentHashMap緩存,這並執行線程安全:

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

java.util.Date包含時間java.sql.Date沒有。 謝謝,我會根據你的建議使用ConcurrentHashMap。 但是,我應該在哪裏調用load()? –

+0

對不起,這應該是一個List不是地圖。我已將問題編輯到List。 –

+0

例如使用'java.util.concurrent.ConcurrentSkipListSet'爲例 – injecteer