当数据库中的东西改变了以后,缓存中的相应数据应该被删除,确切地说应该尽量少地删除。比如你要发一个帖子,什么数据改变了,论坛的帖子数,论坛的最后更新日期,论坛的帖子列表也得重新从数据库中得到。
注意,最后一个操作看起来很费力气,其实不然。这个操作并非对所有用户都有影响,是的,它只影响了第一个访问该论坛的用户。并且帖子列表是分页取得的,所以并不要多少磁盘操作。下面把整个流程好好整理一下。
client代码就这两行
Jive是在forum.addThread()时才真正往数据库里放呢
forum(ForumProxy)检测完权限后,dbforum(DbForum)就要执行addThread操作了:
注意,最后一个操作看起来很费力气,其实不然。这个操作并非对所有用户都有影响,是的,它只影响了第一个访问该论坛的用户。并且帖子列表是分页取得的,所以并不要多少磁盘操作。下面把整个流程好好整理一下。
client代码就这两行
forum=forumFactory.getForum(2L);.
forum.addThread(forumFactory.createThread(newMessage););;Jive是在forum.addThread()时才真正往数据库里放呢
forum(ForumProxy)检测完权限后,dbforum(DbForum)就要执行addThread操作了:
public void addThread(ForumThread thread); {
boolean abortTransaction = false;
// 1 更新thread,因为thread可能已经在数据库中了(这是设计中最令人恼火的地方,你必须考虑你的每一段代码在任何输入条件下,都应该分别怎么做)
// Now, insert the thread into the database. Depending on if this
//
//你看,又来了吧! method was called internally or not, the thread object might
// be wrapped by a proxy or not.
if (thread instanceof ForumThreadProxy); {
ForumThreadProxy proxyThread = (ForumThreadProxy);thread;
DbForumThread dbThread = (DbForumThread);proxyThread.getProxiedForumThread();;
dbThread.insertIntoDb(this, con);;
}
else {
DbForumThread dbThread = (DbForumThread);thread;
dbThread.insertIntoDb(this, con);;
}
}
catch(Exception e); {
e.printStackTrace();;
abortTransaction = true;
}
finally {
ConnectionManager.closeTransactionConnection(con, abortTransaction);;
}
// Thread count has changed, so remove the forum from cache.
factory.cacheManager.forumCache.remove(this.id);;
//这个帖子作者的缓存也得改!
// Expire the userMessageCountCache if the root message was not posted
// anonymously.
ForumMessage message = thread.getRootMessage();;
if (!message.isAnonymous();); {
factory.userMessageCountCache.remove(message.getUser();.getID(););;
}
}
博客主要讲述数据库内容改变后,缓存中相应数据应尽量少地删除。以发帖子为例,说明论坛的帖子数、最后更新日期、帖子列表等数据会改变,且帖子列表重新获取只影响首个访问用户,还提及了相关操作流程及client代码。
629

被折叠的 条评论
为什么被折叠?



