论坛首页 Java企业应用论坛

让ibatis 支持 memcached

浏览 10763 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-11-21   最后修改:2009-11-21
ibatis 不支持Memcached ,只支持第三方的oscache.
所以看了一下缓存模块源码,觉得的很好扩展,于是就实现了一下,不知是否合理还请大家扳砖

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>





   发表时间:2009-11-23   最后修改:2009-11-23
怎么没有人批一下!
0 请登录后投票
   发表时间:2009-11-23   最后修改:2009-11-24
怎么扩展ibatis 支持Memcached 希望楼主能给出代码
难道需要修改源码然后再编译之后拷贝到jar中吗
0 请登录后投票
   发表时间: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的方式还是需要重新编译源码。
0 请登录后投票
   发表时间: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的方式还是需要重新编译源码。

建议不错!插件机制易于扩展!
0 请登录后投票
   发表时间:2009-11-24  
哦,这个有用~~~,thanks
0 请登录后投票
   发表时间:2009-11-24  
不可能这样玩吧,可以看看oscache的整合实现
如果真提供这样的扩展机制,也太不可思议了。
0 请登录后投票
   发表时间:2009-11-24  
itstarting 写道
不可能这样玩吧,可以看看oscache的整合实现
如果真提供这样的扩展机制,也太不可思议了。

那你有什么高见!
0 请登录后投票
   发表时间:2009-12-29  
这位兄弟不错啊,起码公布了自己具体实现。
附件里头是某博士的学术文章,我感觉你比他写的好。
博士让ibatis支持memcached思路跟你不一样,提供给你参照参照。
0 请登录后投票
   发表时间:2009-12-29  
eyeqq 写道
这位兄弟不错啊,起码公布了自己具体实现。
附件里头是某博士的学术文章,我感觉你比他写的好。
博士让ibatis支持memcached思路跟你不一样,提供给你参照参照。

谢谢,我的实现方式最大缺点就是要修改源码,
不过有人提出使用插件的方式.
我想通过类似struts2插件方式去实现,但是一直没有好的思路.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics