系統(tǒng)中,某些DB數(shù)據(jù)需要頻繁更新,但實(shí)時性不強(qiáng),可以采用延時更新的方式。設(shè)定一個間隔時間,累計更新數(shù)據(jù),再通過特定的work thread統(tǒng)一更新。Apache Roller這個開源的Java Blog 正是才用了這種方式,實(shí)現(xiàn)站點(diǎn)計數(shù)的延時更新。
優(yōu)點(diǎn):減少了數(shù)據(jù)庫的一部分壓力。尤其是在高并發(fā)下,數(shù)據(jù)庫I/O及并發(fā)處理的壓力
缺點(diǎn):實(shí)效性差,用戶在某個時間點(diǎn)內(nèi)獲取的數(shù)據(jù)不準(zhǔn)確。
附圖為 實(shí)現(xiàn)數(shù)據(jù)延時更新的Class Diagram
說明:
HitCountQueue.java 為站點(diǎn)計數(shù)隊(duì)列,singleton instance,通過processHit 方法添加站點(diǎn)計數(shù),通過resetHits方法清空Queue,為防止同步問題,增加了synchronized。在其構(gòu)造函數(shù)內(nèi),會啟動一個 workThread實(shí)例,完成隊(duì)列數(shù)據(jù)到數(shù)據(jù)庫的持久化工作。
Job interface 為任務(wù)接口
HitCountProcessingJob.java 實(shí)現(xiàn)了Job接口,完成數(shù)據(jù)更新的任務(wù)。
WorkerThread.java 執(zhí)行Job的工作線程,ContinuousWorkerThread繼承自WorkerThread,增加了時間間隔的功能。線程執(zhí)行后,會sleep 指定的時間。