论坛首页 Java企业应用论坛

让ibatis 支持 memcached

浏览 10822 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-12-29  
也不会要重新打包啊。
只有
typeHandlerFactory.putTypeAlias("MEMCACHED", MemcachedCacheController.class.getName()); 
这里是需要修改原码的。
其它的都是直接扩展。
楼主有没试过直接用类名的使用方式?应该可以吧。
0 请登录后投票
   发表时间:2009-12-29  
typeHandlerFactory.putTypeAlias("MEMCACHED", MemcachedCacheController.class.getName()); 

对就是这里,我肯定试过!
0 请登录后投票
   发表时间: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的缓存。显然这样就有问题了吧?
0 请登录后投票
   发表时间: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啊!
我采用的这个方案,并不算完美。希望大家指点.
0 请登录后投票
   发表时间: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层,很久没更新了。
楼主现在有没有什么最新的进展?
0 请登录后投票
   发表时间:2010-06-17  
看看 ,不错啊
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间:2010-06-22  
itstarting 写道
不可能这样玩吧,可以看看oscache的整合实现
如果真提供这样的扩展机制,也太不可思议了。

ibatis的cache和序列化方法好像都是固定的,不改代码没法改.很恶心的设计。
0 请登录后投票
   发表时间: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的。

0 请登录后投票
论坛首页 Java企业应用版

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