对论坛代码的一点疑问

最近研究 论坛的代码,说一下我的理解,以及疑问,就以MessageListAction 为入口
MessageListAction 中有个方法 getPageIterator是通过forumMessageQueryService的getMessages(new Long(threadId), start, count) 方法得到一个PageIterator的
再看forumMessageQueryService中的实现 发现getMessages是messageQueryDao的getMessages(threadId, start, count)方法干的,再去看看dao中的getMessages方法,他是通过 pageIteratorSolver.getPageIterator(GET_ALL_ITEMS_ALLCOUNT, GET_ALL_ITEMS, params, start, count)这个方法返回的。pageIteratorSolver像是个jdbc的模板类,getPageIterator返回的PageIterator对象好像是只有实体ID的list
我现在 的问题是 1,PageIterator中的实体Id是在哪里被组装成完整对象的,按理说应该是用Builder装配的啊,但我怎么都没找到具体的代码啊,
2,dao查询出来的都是Id的集合,然后组装成一个完整的聚合对象,那缓存的更新该怎么实现,比如有个Messages被删除或修改,Messages的所有缓存都删除吗,还是说同步刚刚修改的缓存?然后清除查询出Messages 的id集合的那个缓存,如果一有Messages的改动就全部删除Messages的缓存我感觉太浪费了,如果Messages缓存很大的话那就更难以接受了。
这两问题可能有点傻,不过一直困扰着我

2010年01月12日 15:29 "cmzx3444"的内容
1,PageIterator中的实体Id是在哪里被组装成完整对象的,按理说应该是用Builder装配的啊,但我怎么都没找到具体的代码啊,

这是在PageIteratorSolver内部实现的,最终还是通过jdbcTemp通过数据库获得ID集合。

这种先获得ID集合,再根据ID获得缓存中已经缓存的实体方式,其设计原来来自于原来Jive论坛,也和Hibernate的批量查询优化是一致。可以说是行之有效的公开模式了。

2010年01月12日 15:29 "cmzx3444"的内容

2,dao查询出来的都是Id的集合,然后组装成一个完整的聚合对象,那缓存的更新该怎么实现,比如有个Messages被删除或修改,Messages的所有缓存都删除吗,还是说同步刚刚修改的缓存?然后清除查询出Messages 的id集合的那个缓存,如果一有Messages的改动就全部删除Messages的缓存我感觉太浪费了,如果Messages缓存很大的话那就更难以接受了。

缓存两种:ID集合和实体模型本身。
如果是实体删除或新增,就必须更新ID集合,是个数发生变化了。
如果是实体本身内部发生变化了,就根据ID删除缓存中这个实体对象即可。
前者是属于pageiteratorsolver.clear即可,后者使用modelmanagder.clear(实体ID),框架会自动清除所有key值中有ID值的实体。

如果考虑修改频繁,这时持久层采取key-value存储,如Tokyo Cabinet 和Tyrant 就可以,缓存只是适合读写可以分离架构,而且以读为主。

key-value存储 我还不怎么了解,key-value总让我想到java 中的Map,所以我就没理解key-value是怎么做查询的,这些新技术真的很诱人,不过现在公司做的几个小项目,真的让人吐血,

不知道bang大哥有没有研究过hadoop,我突然对它很感兴趣,不过就是功力不够,只知道hadoop是对应google的三大核心的一种开源的实现,想想太神了,哈哈

2010年01月12日 16:18 "cmzx3444"的内容
key-value存储 我还不怎么了解,key-value总让我想到java 中的Map,所以我就没理解key-value是怎么做查询的

实际上很简单,比如如果你熟悉MySQL,MongoDB就很方便,按照方式和MYSQL比较类似,看这个PPT写了安装过程

你实际是可以象MAP那样用它,它是一个大MAP。

Hadoop=Map/reduce算法 + key-values存储。Hadoop 擅长什么?

谢谢bang大哥,受教了