一類數據多種存儲
爲提升系統訪問性能,程序設計通常會考慮將頻繁查詢的數據加載到內存或者內存數據庫。如果一類數據,即要在內存中存儲一份,又要在數據庫中存儲一份。下面的代碼是獲取Article(文章)的實現。
public Article getArticle(int articleId) {
Article article = articleDaoMemcachedImpl.getArticle(articleId);
if (article == null) {
article = articleDaoMysqlImpl.getArticle(articleId);
if (article != null) {
articleDaoMemcachedImpl.addArticle(article);
}
}
return article;
}
通過上述代碼我們可以看到,程序會先調用articleDaoMemcachedImpl.getArticle獲取,如果獲取不到,再調用articleDaoMysqlImpl.getArticle獲取,然後再調用articleDaoMemcachedImpl.addArticle寫入。上述articleDaoMemcachedImpl是Memcache實現,articleDaoMysqlImpl是mysql實現。
這種實現,代碼臃腫且不易擴展。假設需要再增加一種實現的情況下,對代碼改動很大。使用XXX框架提供的Dao標準Api,可以很方便的實現擴展且代碼簡潔。
public Article get(int articleId) {
return CacheLoader.get(articleDaoMemcachedImpl, articleDaoMysqlImpl,
articleId);
}
簡單的一句調用,就完美實現了一類數據二類存儲,如果需要再增加一層存儲,只需要再增加一類實現傳入就可以了。
XXXX Dao標準接口約定了當出現多種存儲時,需要定義DaoCacaheImpl實現。上述例子的代碼都是在DaoCacaheImpl裏實現的。前面的共識裏第三條也對此進行了說明。完整的文件結構如下:
ArticleDao(接口), ArticleDaoCacheImpl(cache實現ArticleDao接口), ArticleDaoMemcachedImpl(memcache實現ArticleDao接口), ArticleDaoMysqlImpl(mysql實現ArticleDao接口)。