在JavaEEdev站點(http://www.javaeedev.com)的設計中,有幾類數據是極少變化的,如ArticleCategory(文檔分類),ResourceCategory(資源分類),Board(論壇版面)。在對應的DAO實現中,總是一次性取出所有的數據,例如:
List<ArticleCategory> getArticleCategories();
此類數據的特點是:數據量很小,讀取非常頻繁,變化卻極慢(幾天甚至幾十天才變化一次),如果每次通過DAO從數據庫獲取數據,則增加了數據庫服務器的壓力。為了在不影響整個系統結構的情況下透明地緩存這些數據,可以在Facade一層通過Proxy模式配合ReadWriteLock實現緩存,而客戶端和后臺的DAO數據訪問對象都不受影響:
首先,現有的中間層是由Facade接口和一個FacadeImpl具體實現構成的。對ArticleCategory的相關操作在FacadeImpl中實現如下:
public class FacadeImpl implements Facade {
protected CategoryDao categoryDao;
public void setCategoryDao(CategoryDao categoryDao) {
this.categoryDao = categoryDao;
}
// 讀操作:
public ArticleCategory queryArticleCategory(Serializable id) {
return categoryDao.queryArticleCategory(id);
}
// 讀操作:
public List<ArticleCategory> queryArticleCategories() {
return categoryDao.queryArticleCategories();
}
// 寫操作:
public void createArticleCategory(ArticleCategory category) {
categoryDao.create(category);
}
// 寫操作:
public void deleteArticleCategory(ArticleCategory category) {
categoryDao.delete(category);
}
// 寫操作:
public void updateArticleCategory(ArticleCategory category) {
categoryDao.update(category);
}
// 其他方法省略...
}
設計代理類FacadeCacheProxy,讓其實現緩存ArticleCategory的功能:
public class FacadeCacheProxy implements Facade {
private Facade target;
public void setFacadeTarget(Facade target) {
this.target = target;
}