~在思考中沉淀~

博客园 首页 新随笔 联系 订阅 管理
[这篇Post是对WhoIsOnline ;) - 解读CNForum源码中在线用户统计的补充,继续分析系统更新LastActivity的过程。如果对上下文不清楚,请参见前文。]
有朋友看到我前面的WhoIsOnline ;) - 解读CNForum源码中在线用户统计,对其中如何判断用户是否Activity(活动)提出了疑问。这个问题在上次分析的过程没有深究,想当然的认为系统肯定是在用户进行一些操作时更新了数据库中用户最后Activity的时间。
但是到底是怎么实现的?
如前面的分析说的WhoIsOnline(pastMinutes)方法调用了存储过程forums_Users_Online,在这个存储过程中使用的一个关键数据就是forums_UsersOnline表中的LastActivity字段。那么只要注意系统如何更新这个字段不就可以了吗?
使用SQL Server中显示表相关性的功能,得到与forums_UsersOnline表有相关性的存储过程(肯定是某个存储过程更新了这表啊)。结果如下图:

哦,原来有两个存储过程forums_system_UsersIsOnline和forums_Users_Online依附于这表,而且前者我们已经知道,只需要知道看看后面这个存储过程就可以了。
查看存储过程forums_system_UsersIsOnline,发现其中有这样语句:
IF EXISTS(SELECT UserID FROM forums_UsersOnline WHERE UserID = @UserID)
  UPDATE forums_UsersOnline SET LastActivity = GetDate(), LastAction = @LastAction WHERE UserID = @UserID
 ELSE
  INSERT INTO forums_UsersOnline VALUES (@UserID, GetDate(), @LastAction)
OK!就是这里修改了forums_UsersOnline表的LastActivity字段为GetDate()。恩,只要继续查找解决方案看到底是那段代码调用了存储过程forums_system_UsersIsOnline就可以啦~!轻松搞定,嘿嘿!
马上在解决方案中查找forums_system_UsersIsOnline,结果是————“匹配文件:0”!!
为什么会这样呢??

此路不通,只有换条路喽~ 解决方案中查找不到调用forums_system_UsersIsOnline的地方,那还有什么地方可能调用这个存储过程呢???(开动~~~)
系统中实现数据访问的全部是存储过程,那么有没有可能是哪个存储过程间接的调用了forums_system_UsersIsOnline呢?
继续查看forums_system_UsersIsOnline的相关性,唉~~,没有对象是依附于这个存储过程的(后话:怀疑是不是无法显示存储过程之间的相关性呢!)。此路有不通!
不过这时突然发现一个问题:其实应该不用这么麻烦啊!只要注意哪些操作会影响LastActivity值就可以了,然后分析相应操作的代码不就可以吗!。
于是打开查询分析器(select * from forums_UsersOnline)、SQL事件探察器。
使用注册的用户登录后,查询分析器找到并记录下此时的LastActivity值,随便查看一个版块,再次查找LastActivity值,发现较前面值已经发生变化了。也就是说刚才的操作中某个地方更新了forums_UsersOnline表的LastActivity字段。
重现刚才的操作,并启动跟踪,得到跟踪记录如下图:


检查刚才的操作中所调用的存储过程,发现在存储过程forums_User_Get中有
EXEC forums_system_UserIsOnline @UserID, @LastAction, @IPAddress
。原来就是这里更新了LastActivity值!
在解决方案中查找发现SqlDataProvider类的GetUser方法调用了这个存储过程,继续查找使用了GetUser方法的地方。
好多啊~也就是系统在用户触发某些操作时通过GetUser方法更新了LastActivity(如果你关心到底是哪些时机更新的,就自己查看代码喽~)。
至此,系统的实现过程就基本清楚了!

总结:
在分析的过程中绕了弯路,其实只要明确“系统肯定是在用户进行某些操作时更新了LastActivity”这一点,并且及早的使用Sql事件探察器问题就可以很快解决了。

posted on 2005-01-08 16:37  ~在思考中沉淀~  阅读(948)  评论(1编辑  收藏  举报