一个基于Cache+Repository+DAO的实现
2009-06-28 13:34
555 查看
参考资料 JForum
源代码
CacheEngine
DefaultCacheEngine
JBossCacheEngine:
Cacheable:
MyRepository:
源代码
CacheEngine
public interface CacheEngine { /** 默认的空的完全限定名 */ public final static String DEFAULT_EMPTY_FQN = "empty_fqn"; /** * 初始化缓存 */ public void init(); /** * 停止缓存 */ public void stop(); /** * 添加一个新的对象到缓存中去 * * @param key * 键 * @param value * 值 */ public void add(String key, Object value); /** * 添加一个新的对象到缓存中去 * * @param fqn * 缓存的完全限定名(full qualified name) * @param key * 键 * @param value * 值 */ public void add(String fqn, String key, Object value); /** * 从缓存中删除一个值 * * @param key * 要删除值的键 */ public void remove(String key); /** * 从缓存中删除一个值 * * @param fqn * 缓存的完全限定名(full qualified name) * @param key * 要删除值的键 */ public void remove(String fqn, String key); /** * 从缓存中获得一个值 * * @param fqn * 缓存的完全限定名(full qualified name) * @return 如果不存在,返回<code>null</code> ,否则返回<code>Object</code> */ public Object getValue(String fqn); /** * 从缓存中获得一个值 * * @param fqn * 缓存的完全限定名(full qualified name) * @param key * 获得值的键 * @return 如果不存在,返回<code>null</code> ,否则返回<code>Object</code> */ public Object getValue(String fqn, String key); /** * 获得缓存中所有的值 * * @param fqn * 缓存的完全限定名(full qualified name) * @return 如果不存在,返回<code>null</code> ,否则返回<code>Collection</code> */ @SuppressWarnings("unchecked") public Collection getValues(String fqn); }
DefaultCacheEngine
public class DefaultCacheEngine implements CacheEngine { private volatile Map<String, Object> cache; @Override public void add(String key, Object value) { cache.put(key, value); } @SuppressWarnings("unchecked") @Override public void add(String fqn, String key, Object value) { Map fqnMap = (Map) cache.get(fqn); if (fqnMap == null) { fqnMap = new HashMap(); } fqnMap.put(key, value); cache.put(fqn, fqnMap); } @Override public Object getValue(String fqn) { return cache.get(fqn); } @SuppressWarnings("unchecked") @Override public Object getValue(String fqn, String key) { Map fqnMap = (Map) cache.get(fqn); if (fqnMap == null) { return null; } return fqnMap.get(key); } @SuppressWarnings("unchecked") @Override public Collection getValues(String fqn) { Map fqnMap = (Map) cache.get(fqn); if (fqnMap == null) { return null; } return fqnMap.values(); } @Override public void init() { cache = new ConcurrentHashMap<String, Object>(); } @Override public void remove(String key) { cache.remove(key); } @SuppressWarnings("unchecked") @Override public void remove(String fqn, String key) { Map fqnMap = (Map) cache.get(fqn); if (fqnMap != null) { fqnMap.remove(key); } } @Override public void stop() { } }
JBossCacheEngine:
public class JBossCacheEngine implements CacheEngine { private volatile Cache<String, Object> cache; private volatile Node<String, Object> rootNode; @Override public void add(String key, Object value) { this.add(DEFAULT_EMPTY_FQN, key, value); } @Override public void add(String fqn, String key, Object value) { Fqn<String> cacheFqn = Fqn.fromString(fqn); Node<String, Object> childNode = rootNode.addChild(cacheFqn); childNode.put(key, value); } @Override public Object getValue(String key) { return this.getValue(DEFAULT_EMPTY_FQN, key); } @Override public Object getValue(String fqn, String key) { if (rootNode == null) { return null; } Node<String, Object> childNode = rootNode.getChild(Fqn.fromString(fqn)); if (childNode == null) { return null; } return childNode.get(key); } @SuppressWarnings("unchecked") @Override public Collection getValues(String fqn) { if (rootNode == null) { return null; } return rootNode.getChild(Fqn.fromString(fqn)).getData().values(); } @Override public void init() { CacheFactory<String, Object> cacheFactory = new DefaultCacheFactory<String, Object>(); cache = cacheFactory.createCache("config/cache/jboss_cache_config.xml"); //cache.addCacheListener(new JBossCacheListener()); cache.create(); cache.start(); rootNode = cache.getRoot(); } @Override public void remove(String key) { this.remove(DEFAULT_EMPTY_FQN, key); } @Override public void remove(String fqn, String key) { Node<String, Object> childNode = rootNode.getChild(Fqn.fromString(fqn)); if (childNode != null) { childNode.remove(key); } } @Override public void stop() { } }
Cacheable:
public interface Cacheable { public void setCacheEngine(CacheEngine cacheEngine); public void refreshCache(String key) ; public void refreshCache(String fqn,String key) ; }
MyRepository:
public class MyRepository implements Cacheable{ private CacheEngine cacheEngine ; @Override public void refreshCache(String key) { cacheEngine.remove(key) ; } @Override public synchronized void refreshCache(String fqn, String key) { cacheEngine.remove(fqn, key) ; } @Override public synchronized void setCacheEngine(CacheEngine cacheEngine) { this.cacheEngine = cacheEngine ; } public List getStoredApple(){ List results = (List) cacheEngine.getValue("/fruit", "apple") ; if(results==null){ //From DAO results = dao.query() ; cacheEngine.add("/fruit", "apple", results) ; } return results ; } }
相关文章推荐
- java java local cache本地缓存的两种实现,一个基于list轮询一个基于timer定时
- java java local cache本地缓存的两种实现,一个基于list轮询一个基于timer定时
- 分享一个用Xcode4实现基于Webservice用户登录的iphone程序
- WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于WS-MEX的实现](提供模拟程序)
- WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于HTTP-GET的实现](提供模拟程序)
- 基于OpenCV3实现一个窗口显示若干张图片
- 一个简单基于LRU连接检测实现
- WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于WS-MEX的实现](提供模拟程序)
- 实现网页文本框显示灰色提示文字且点击后消失的一个小函数(基于jquery)
- 用C#实现一个基于http的文件发布程序
- 基于innerHTML中的script广告实现代码[广告全部放在一个js里面] 原创
- Webservice01---快速的实现一个基于Jws的WebService项目
- window.top[_CACHE]实现多个jsp页面共享一个js对象
- WeText项目:一个基于.NET实现的DDD、CQRS与微服务架构的演示案例
- [C# 网络编程系列]专题十一:实现一个基于FTP协议的程序——文件上传下载器
- window.top[_CACHE]实现多个jsp页面共享一个js对象
- 【C#网络编程系列】专题十一:实现一个基于FTP协议的程序—文件上传下载器
- 一个简单的基于注解的 Controller (spring 2.5 annotation 方式实现mvc )
- 基于gem5模拟trace的cache模拟器的实现