锁定老帖子 主题:让ibatis 支持 memcached
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-11-21
最后修改:2009-11-21
所以看了一下缓存模块源码,觉得的很好扩展,于是就实现了一下,不知是否合理还请大家扳砖 SqlMapConfiguration 中新建别名 registerDefaultTypeAliases方法中添加 typeHandlerFactory.putTypeAlias("MEMCACHED", MemcachedCacheController.class.getName()); public interface OtherCacheHelper<T> { //初始化第三方缓存 public void initCache() ; //获取第三方缓存句柄 //client分布式中相关主机 public T getCacheHandler(String client) ; } 采用xmemcached连接memcached server public class MemcacheCacheHelper implements OtherCacheHelper<XMemcachedClient> { private static XMemcachedClient xmc; public MemcacheCacheHelper() { initCache(); } @Override public XMemcachedClient getCacheHandler(String client) { // TODO Auto-generated method stub return xmc; } @Override public void initCache() { // TODO Auto-generated method stub try { xmc = new XMemcachedClient("192.168.1.105", 11212); } catch (Exception e) { e.printStackTrace(); } } } memcached管理类 public class MemcachedCacheController implements CacheController { private XMemcachedClient cacheHandler = null; //keyList 管理key private LinkedList<String> keyList = null; private int cacheSize; public MemcachedCacheController() { cacheSize = 100; keyList = new LinkedList<String>(); } @Override public void flush(CacheModel cacheModel) { // TODO Auto-generated method stub try { for (String key : keyList) { cacheHandler.delete(key); } } catch (Exception e) { e.printStackTrace(); } keyList.clear(); } @Override public Object getObject(CacheModel cacheModel, Object key) { // TODO Auto-generated method stub String ckey = getKey(cacheModel, key); try { return cacheHandler.get(ckey); } catch (Exception e) { e.printStackTrace(); return null; } } @Override public void putObject(CacheModel cacheModel, Object key, Object object) { String ckey = getKey(cacheModel, key); // TODO Auto-generated method stub keyList.addLast(ckey); try { cacheHandler.add(ckey,0,object); if (keyList.size() > cacheSize) { String first = keyList.removeFirst(); cacheHandler.delete(first); } } catch (Exception e) { e.printStackTrace(); } } @Override public Object removeObject(CacheModel cacheModel, Object key) { // TODO Auto-generated method stub String ckey = getKey(cacheModel, key); try { if (keyList.contains(ckey)) { return cacheHandler.delete(ckey); } } catch (Exception e) { e.printStackTrace(); } return null; } @Override public void setProperties(Properties props) { // TODO Auto-generated method stub String size = props.getProperty("cache-size"); if (size == null) { size = props.getProperty("size"); } if (size != null) { cacheSize = Integer.parseInt(size); } //获取缓存帮助类 String cacheHelpObject = props.getProperty("cache-helper"); String cacheclient = props.getProperty("cache-client"); if (cacheHelpObject != null) { try { Class clazz = Resources.classForName(cacheHelpObject); Object obj = Resources.instantiate(clazz); if (obj instanceof MemcacheCacheHelper) { cacheHandler = ((MemcacheCacheHelper) obj) .getCacheHandler(cacheclient); } } catch (Exception e) { e.printStackTrace(); } } } //因为我认为ibaits 的缓存key 太长了,所以采用再hash的方法,再加上的缓存ID private String getKey(CacheModel cacheModel, Object cacheKey) { String key = cacheKey.toString(); int keyhash = key.hashCode(); String cacheId = cacheModel.getId(); return cacheId + "_" + keyhash; } } 对应实体XML设置 <cacheModel type="MEMCACHED" id="account-cache" serialize="true"> <flushInterval hours="12"/> <property name="size" value="10" /> <property name="cache-helper" value="com.ibatis.sqlmap.engine.cache.memcached.MemcacheCacheHelper" /> <property name="cache-client" value="mclient0" /> </cacheModel> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-11-23
最后修改:2009-11-23
怎么没有人批一下!
|
|
返回顶楼 | |
发表时间:2009-11-23
最后修改:2009-11-24
怎么扩展ibatis 支持Memcached 希望楼主能给出代码
难道需要修改源码然后再编译之后拷贝到jar中吗 |
|
返回顶楼 | |
发表时间:2009-11-23
最后修改:2009-11-23
mem的key不支持空格,长度不能超过78个字符,这个要重新测试下。
我用的key private String getIdentityKey(Object key){ String result; DateFormat df = new SimpleDateFormat("yyyyMMddHHmmsss"); String tmp = df.format(new Date()); result = MD5.getMD5(tmp.getBytes()) + MD5.getMD5(key.toString().getBytes()); return result; } 有没有类似插件机制的实现方法,lz的方式还是需要重新编译源码。 |
|
返回顶楼 | |
发表时间:2009-11-23
aimer311 写道 mem的key不支持空格,长度不能超过78个字符,这个要重新测试下。
我用的key private String getIdentityKey(Object key){ String result; DateFormat df = new SimpleDateFormat("yyyyMMddHHmmsss"); String tmp = df.format(new Date()); result = MD5.getMD5(tmp.getBytes()) + MD5.getMD5(key.toString().getBytes()); return result; } 有没有类似插件机制的实现方法,lz的方式还是需要重新编译源码。 建议不错!插件机制易于扩展! |
|
返回顶楼 | |
发表时间:2009-11-24
哦,这个有用~~~,thanks
|
|
返回顶楼 | |
发表时间:2009-11-24
不可能这样玩吧,可以看看oscache的整合实现
如果真提供这样的扩展机制,也太不可思议了。 |
|
返回顶楼 | |
发表时间:2009-11-24
itstarting 写道 不可能这样玩吧,可以看看oscache的整合实现
如果真提供这样的扩展机制,也太不可思议了。 那你有什么高见! |
|
返回顶楼 | |
发表时间:2009-12-29
这位兄弟不错啊,起码公布了自己具体实现。
附件里头是某博士的学术文章,我感觉你比他写的好。 博士让ibatis支持memcached思路跟你不一样,提供给你参照参照。 |
|
返回顶楼 | |
发表时间:2009-12-29
eyeqq 写道 这位兄弟不错啊,起码公布了自己具体实现。
附件里头是某博士的学术文章,我感觉你比他写的好。 博士让ibatis支持memcached思路跟你不一样,提供给你参照参照。 谢谢,我的实现方式最大缺点就是要修改源码, 不过有人提出使用插件的方式. 我想通过类似struts2插件方式去实现,但是一直没有好的思路. |
|
返回顶楼 | |