——Apache Roller源碼分析
系統(tǒng)中,某些DB數(shù)據(jù)需要頻繁更新,但實(shí)時(shí)性不強(qiáng),可以采用延時(shí)更新的方式。設(shè)定一個(gè)間隔時(shí)間,累計(jì)更新數(shù)據(jù),再通過(guò)特定的work
thread統(tǒng)一更新。Apache Roller這個(gè)開(kāi)源的Java Blog 正是才用了這種方式,實(shí)現(xiàn)站點(diǎn)計(jì)數(shù)的延時(shí)更新。
優(yōu)點(diǎn):減少了數(shù)據(jù)庫(kù)的一部分壓力。尤其是在高并發(fā)下,數(shù)據(jù)庫(kù)I/O及并發(fā)處理的壓力
缺點(diǎn):實(shí)效性差,用戶(hù)在某個(gè)時(shí)間點(diǎn)內(nèi)獲取的數(shù)據(jù)不準(zhǔn)確。
附圖為 實(shí)現(xiàn)數(shù)據(jù)延時(shí)更新的Class Diagram

說(shuō)明:
HitCountQueue.java 為站點(diǎn)計(jì)數(shù)隊(duì)列,singleton instance,通過(guò)processHit
方法添加站點(diǎn)計(jì)數(shù),通過(guò)resetHits方法清空Queue,為防止同步問(wèn)題,增加了synchronized。在其構(gòu)造函數(shù)內(nèi),會(huì)啟動(dòng)一個(gè)
workThread實(shí)例,完成隊(duì)列數(shù)據(jù)到數(shù)據(jù)庫(kù)的持久化工作。
Job interface 為任務(wù)接口
HitCountProcessingJob.java 實(shí)現(xiàn)了Job接口,完成數(shù)據(jù)更新的任務(wù)。
WorkerThread.java
執(zhí)行Job的工作線程,ContinuousWorkerThread繼承自WorkerThread,增加了時(shí)間間隔的功能。線程執(zhí)行后,會(huì)sleep
指定的時(shí)間。