将ReadWriteLock应用于缓存设计
本文最早发表于BEA dev2dev
——针对缓慢变化的小数据的缓存实现模型
在JavaEEdev站点(http://www.javaeedev.com)的设计中,有几类数据是极少变化的,如ArticleCategory(文档分类),ResourceCategory(资源分类),Board(论坛版面)。在对应的DAO实现中,总是一次性取出所有的数据,例如:
1.
List<ArticleCategory> getArticleCategories();
此类数据的特点是:数据量很小,读取非常频繁,变化却极慢(几天甚至几十天才变化一次),如果每次通过DAO从数据库获取数据,则增加了数据库服务器的压力。为了在不影响整个系统结构的情况下透明地缓存这些数据,可以在Facade一层通过Proxy模式配合ReadWriteLock实现缓存,而客户端和后台的DAO数据访问对象都不受影响:
首先,现有的中间层是由Facade接口和一个FacadeImpl具体实现构成的。对ArticleCategory的相关操作在FacadeImpl中实现如下:
01.
public
class
FacadeImpl
implements
Facade {
02.
protected
CategoryDao categoryDao;
03.
public
void
setCategoryDao(CategoryDao categoryDao) {
04.
this
.categoryDao = categoryDao;
05.
}
06.
// 读操作:
07.
public
ArticleCategory queryArticleCategory(Serializable id) {
08.
return
categoryDao.queryArticleCategory(id);
09.
}
10.
// 读操作:
11.
public
List<ArticleCategory> queryArticleCategories() {
12.
return
categoryDao.queryArticleCategories();
13.
}
14.
// 写操作:
15.
public
void
createArticleCategory(ArticleCategory category) {
16.
categoryDao.create(category);
17.
}
18.