发现jivejdon3.6并发下的一个缓存问题,banq老师请教啊

09-05-09 gogo32
    

MessageDaoDecorator类中的getMessageCore(Long messageId)方法里是先在缓存中找,如果没找到就到数据库中去取,然后把从数据库中取出数据组成的对象ForumMessage在放入内存中,但是此时的这个ForumMessage中包含的ForumThread Forum等对象只是包涵ID的空对象,完整对象需要前台再行处理,假如在这个ForumMessage在前台处理完之前,刚好高并发下又有另一个线程来读取这个ForumMessage,jdon的CacheInterceptor就把这个还没处理完的ForumMessage返回给了这个线程,此时这个ForumMessage中的Forum等对象只是包涵ID的空对象,这样在jsp页面显示时就会出问题啊,请问banq老师我理解的对不对呢?

    

banq
2009-05-10 17:44

首先,不会发生在ForuMessage聚合边界内对象没有构建完成,就交给客户端使用的情况,这个由embeded这个状态决定的。

ForumThread是ForumMessage和Forum的根实体,它们生命周期是相同的,是一起从娘肚子里出来的,不可以将ForumThread Forum等对象只是包涵ID的空对象就直接交给客户端,这中间需要经过工厂MessageBuilder等Repository进行聚合集合完整构建。这是DDD的精华和核心。

至于在jsp页面显示时就会出问题是可能其他原因引起的。

[该贴被banq于2009-05-10 17:45修改过]

gogo32
2009-05-13 18:35

但是CacheInterceptor中并没有判断embeded这个字段啊,只要缓存中有这个对象,CacheInterceptor就直接返回这个对象了,就有可能这个对象里只包涵一些ID的空对象

[该贴被gogo32于2009-05-13 18:36修改过]

banq
2009-05-13 20:19

你说得很好,所以,缓存的控制操作应该从DAO层移植到Repository中,只有embeded了才能保持到缓存中,并且这里做好并发控制,因为Repository做的都是串行化单线程工作。

曾经有一个版本我移植过,后来因为觉得和Hibernate架构不太协调,Hibernate也是将缓存置于持久层,所以,缓存这玩艺真不能小瞧,千万别以为它只是数据库的遮羞布,将缓存和Repository结合在一起,更能体现领域对象和缓存的紧密创新关系。

想不到大家想法比我超前了。下次结合考虑 xmuzyu的并发 建议,一起优化一下。

[该贴被banq于2009-05-13 20:22修改过]