jive发贴时,缓存是如何删除的? threadCache
程序员文章站
2022-07-12 23:49:57
...
当数据库中的东西改变了以后,缓存中的相应数据应该被删除,确切地说应该尽量少地删除。比如你要发一个帖子,什么数据改变了,论坛的帖子数,论坛的最后更新日期,论坛的帖子列表也得重新从数据库中得到。
注意,最后一个操作看起来很费力气,其实不然。这个操作并非对所有用户都有影响,是的,它只影响了第一个访问该论坛的用户。并且帖子列表是分页取得的,所以并不要多少磁盘操作。下面把整个流程好好整理一下。
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(););; } }