NutzCN Logo
问答 EhcacheDaoCacheProvider 如何在DaoCache中配置?
发布于 3211天前 作者 汉歌 1420 次浏览 复制 上一个帖子 下一个帖子
标签:

请达人给个案例

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之间没有任何相关性.

添加回复
请先登陆
回到顶部