在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;
}
文章来源于领测软件测试网 https://www.ltesting.net/