flylampard
2010-11-01 13:48
2010年11月01日 12:15 "banq"的内容
...

谢谢banq.我刚才研读了下修改阅读数这个地方的代码,应该是ThreadViewCountManager这个类里的initViewCounter方法。里面的逻辑是先用一个ConcurrentHashMap来缓存进来的update任务。然后用thread去跑。然后慢慢的去write。 不知道我有没有理解对。

说实话 我以前也想过这个解决方案。之前的一个项目也是这样做的。只是形式上有一点点不一样。。

总之。谢谢banq的提点。这下豁然开朗了。这是一条路子。会去尝试解决这个问题。关注jdon2年多了。终于有机会问问题了。以前只是学习。。^_^

flylampard
2010-11-01 14:03
2010年11月01日 12:15 "banq"的内容
具体源码可以见JiveJdon中阅读次数的更新这一功能 ...

但有一点还不太明白。。在代码中

public void initViewCounter(ForumThread thread) {

Long threadId = thread.getThreadId();

ViewCounter viewCounter = thread.getState().getViewCounter();

viewCounter.getLock().writeLock().lock();

try {

int count = -1;

ViewCounter viewCounterOld = concurrentHashMap.get(threadId);

if (viewCounterOld == null) {

count = getFromDB(threadId);

} else

count = viewCounterOld.getViewCount();

thread.setViewCount(count);

concurrentHashMap.put(threadId, viewCounter);

} finally {

viewCounter.getLock().writeLock().unlock();

}

}

这个方法中。。concurrentHashMap 本身是线程安全的,这里为什么还要加锁来控制。。还有一个saveItem也就是把这些数据更新到DB中也有锁的控制

flylampard
2010-11-01 18:10
2010年11月01日 12:15 "banq"的内容
就这个简单功能,可以使用AJAX异步和后台异步架构,具体源码可以见JiveJdon中阅读次数的更新这一功能 ...

刚才研读 “以JiveJdon案例说明对象职责和SOLID原则应用” 中间提到论坛帖子的阅读数是不是那么核心影响论坛整体功能的一个值。。

我的这个场景就是修改的这个值是比较重要,出现差错就会地客户带来损失。这个地方不知道大家还有没有一些建议。

fw2003
2010-11-03 11:48
感觉如果用户对数据的实时性以及响应性要求高的话

LZ的这个问题可以:

1.将需要展现的数据缓存起来,先更新内存中的对象以便用户能够立即看到结果

2.后台异步开启线程做数据库的写操作,将内存中的对象同步到数据库

3.如果失败,回滚事务并恢复内存中的对象(重新从数据库中查询1次获取更新前的数据并同步到内存),当然如果使用SPRING的话,也可在出现异常后自动重试事务

[该贴被fw2003于2010-11-03 11:52修改过]

猜你喜欢
2Go 上一页 1 2