请达人给个案例
4 回复
*/
// 基于Ehcache的DaoCacheProvider
cacheProvider : {
type : "org.nutz.plugins.cache.dao.impl.provider.EhcacheDaoCacheProvider",
fields : {
cacheManager : {
refer : "cacheManager"
}
// 引用ehcache.js中定义的CacheManager
},
events : {
create : "init"
}
}
另外, 不要想着如何使用"EhcacheDaoCacheProvider", 这个类对使用者是透明的, 不具有可"操作性"
该provider内存在的内容,是被序列化过的对象, 存的是byte[], 而非XXXBean, XXXList
存储的key,是CachedNutDaoExecutor.genKey方法生成的, 基于SQL+参数+分页的组合
存储的value,是CacheSerializer做的,默认实现为JavaCacheSerializer
以下操作,在当前版本1.r.55下是不能或很难实现的:
1. 根据id/name直接在缓存中取对象, 除非能拼出genKey一样的key,然后再用CacheSerializer进行反序列化
2. 从集合缓存中取出单一结果, 例如尝试从select * from t_user
的缓存值中获取id=1的值,那是不可行
同一条记录会不会存2次 -- 概况各种查A能不能缓存B, 会不会缓存N次之类的问题
答案是: 会
因为key 的默认策略是 基于SQL+参数+分页的组合 只要任意一个部分不一样,就是不同的key
例如:
select * from t_user
select * from t_user where 1=1 and 2=2
语义上两条sql等价,查询结果一样,但sql不一样,所以得出的key是不一样的, 存2份
select * from t_user
select * from t_user where id=1
语义上, 第一条sql的结果集包含了第二条sql的结果集,那,是否user id=1是怎么存的呢? 不相干. 原因是存的value是byte[], 不具有可查询性. 不能对一个缓存的结果进行sql查询. 在daocache看来, 上述的两个sql对应的是两个不一样的key,对应的value之间没有任何相关性.
添加回复
请先登陆