锁定老帖子 主题:让ibatis 支持 memcached
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-12-29
也不会要重新打包啊。
只有 typeHandlerFactory.putTypeAlias("MEMCACHED", MemcachedCacheController.class.getName()); 这里是需要修改原码的。 其它的都是直接扩展。 楼主有没试过直接用类名的使用方式?应该可以吧。 |
|
返回顶楼 | |
发表时间:2009-12-29
typeHandlerFactory.putTypeAlias("MEMCACHED", MemcachedCacheController.class.getName());
对就是这里,我肯定试过! |
|
返回顶楼 | |
发表时间:2010-02-02
最后修改:2010-02-02
楼主最后几句话会不会有问题?
引用 //因为我认为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; } 有可能会存在多个sql键值对应成一个hashcode的情况。如果加上cacheModel的id一样的话。那么就会造成不同的sql(hash值一样)对应了一个相同的缓存, 比如select * from user这个语句对应了一个缓存。假设另一个sql:select * from product这个语句相好(我是假设)和前一个的sql语句有了相同的hash值。那么此语句(select * from product)从缓存取回来的将是select * from user的缓存。显然这样就有问题了吧? |
|
返回顶楼 | |
发表时间:2010-02-02
超级潜水艇 写道 楼主最后几句话会不会有问题?
引用 //因为我认为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; } 有可能会存在多个sql键值对应成一个hashcode的情况。如果加上cacheModel的id一样的话。那么就会造成不同的sql(hash值一样)对应了一个相同的缓存, 比如select * from user这个语句对应了一个缓存。假设另一个sql:select * from product这个语句相好(我是假设)和前一个的sql语句有了相同的hash值。那么此语句(select * from product)从缓存取回来的将是select * from user的缓存。显然这样就有问题了吧? 两个的SQL对应不同的缓存ID啊! 我采用的这个方案,并不算完美。希望大家指点. |
|
返回顶楼 | |
发表时间:2010-06-16
pan_java 写道 超级潜水艇 写道 楼主最后几句话会不会有问题?
引用 //因为我认为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; } 有可能会存在多个sql键值对应成一个hashcode的情况。如果加上cacheModel的id一样的话。那么就会造成不同的sql(hash值一样)对应了一个相同的缓存, 比如select * from user这个语句对应了一个缓存。假设另一个sql:select * from product这个语句相好(我是假设)和前一个的sql语句有了相同的hash值。那么此语句(select * from product)从缓存取回来的将是select * from user的缓存。显然这样就有问题了吧? 两个的SQL对应不同的缓存ID啊! 我采用的这个方案,并不算完美。希望大家指点. 很有用的思路, 我考虑的是直接在DAO或service层做拦截,和楼主遇到的问题一样,关键点就是key的生成算法。 楼主用hash恐怕不行,因为cacheModel可能会公用,而且同一个sql还有参数的差异,会有冲突的。 还是md5可靠。 打算采用Spring AOP来实现,不过以前有个Spring module项目提供一个通用cache层,很久没更新了。 楼主现在有没有什么最新的进展? |
|
返回顶楼 | |
发表时间:2010-06-17
看看 ,不错啊
|
|
返回顶楼 | |
发表时间:2010-06-21
tedeyang 写道 pan_java 写道 超级潜水艇 写道 楼主最后几句话会不会有问题?
引用 //因为我认为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; } 有可能会存在多个sql键值对应成一个hashcode的情况。如果加上cacheModel的id一样的话。那么就会造成不同的sql(hash值一样)对应了一个相同的缓存, 比如select * from user这个语句对应了一个缓存。假设另一个sql:select * from product这个语句相好(我是假设)和前一个的sql语句有了相同的hash值。那么此语句(select * from product)从缓存取回来的将是select * from user的缓存。显然这样就有问题了吧? 两个的SQL对应不同的缓存ID啊! 我采用的这个方案,并不算完美。希望大家指点. 很有用的思路, 我考虑的是直接在DAO或service层做拦截,和楼主遇到的问题一样,关键点就是key的生成算法。 楼主用hash恐怕不行,因为cacheModel可能会公用,而且同一个sql还有参数的差异,会有冲突的。 还是md5可靠。 打算采用Spring AOP来实现,不过以前有个Spring module项目提供一个通用cache层,很久没更新了。 楼主现在有没有什么最新的进展? 其实直接在DAO或service层做拦截不用修改ibatis源码. 如果你应用缓存只是单一的对象的话。可以用对象的id作为key。 如果多个不同类型缓存的话,可以用对象标识 + 对象id 作缓存key,不用什么md5 |
|
返回顶楼 | |
发表时间:2010-06-22
itstarting 写道 不可能这样玩吧,可以看看oscache的整合实现
如果真提供这样的扩展机制,也太不可思议了。 ibatis的cache和序列化方法好像都是固定的,不改代码没法改.很恶心的设计。 |
|
返回顶楼 | |
发表时间:2010-10-29
写道
//因为我认为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; } 不用这样吧,xmemcached会对key进行hash的。 |
|
返回顶楼 | |