TO:  liulxmooo
只要他20分钟没有操作。
我就会把他删除呀。

解决方案 »

  1.   

    那垃圾数据还是会存在20分钟的,如果你是小型应用可能没问题,但是当用户数>=20万时,垃圾数据太多了,虽然用户数那么多的情况实际上很少出现,不过既然是讨论,就准求完美吧,我只是提交bug,还是靠楼主你自己解决吧
      

  2.   

    我的以下所用的存储过程为:
    //删除超时的会员
    account.DeleteOnline();
    CREATE PROCEDURE Member_DelOnline
    AS
    DELETE FROM UserOnline WHERE DATEDIFF(minute, uson_date, getdate())>20
    GO
      

  3.   

    TO:  liulxmooo
    你说到的问题确实存在。
    只是一般很难立刻知道用户关闭浏览器。
    用session超时也存在。
    谢谢。
      

  4.   

    谢谢:
    人数过多也没问题。
    不过我可以修改一下。不是每次都去删除20分钟没活动的人,而是定时,这样服务器负荷就小多了。可能存在两个不足的地方:
    1、请求HTML页不能触发。
    2、同一IP的多个人当作一个人处理。
      

  5.   

    我现在也在做这个东西,不过我的理解就是在线人数一说并不准确,应该叫做 在过去的XX时间内有多少人访问了网站 才对,在每一次对网站的请求时都记录访问者的相关信息,和你的思路一样,但并不去删除过期的数据,因为这些数据可以用来做网站访问统计的数据来源,由于数据是存在数据库中的,显示所谓的在线人数只不过是选取最新的 XX 条数据而已,并没有什么压力,如果这样考虑的话做在线人数是很简单的了
      

  6.   

    srz007: 
    老兄说得很有道理。不过这样数据库访问就很大了啊。
      

  7.   

    2、同一IP的多个人当作一个人处理。----这是一个很大的问题,对于企业用户,或者机关、学校等。一般都是一大群人使用一个IP的,所以根据IP判断不合适。
      

  8.   

    protected void Session_Start(Object sender, EventArgs e)可以在这个函数里写上线的程序,在protected void Session_End(Object sender, EventArgs e)函数里写下线的程序
      

  9.   

    To: sykpboy
    确实如此。不过如果不通过IP。通过什么呢?硬盘序列号?呵呵。这就更麻烦了。
      

  10.   

    你可以把在线这个操作的数据库放在access中,取得客户端可以用cookie的方法来区别,cookie的值保存其第一次访问时的SessionId加上其Ip地址的组合字符,就不会产生歧义了,如果这个用户再次访问就不赋这个cookie值了,我也在制作中,有些思路可能不大有条理,做完再理清些吧
      

  11.   

    srz007(呵呵):
    学了很多。感谢!
    完善一下。增加一个字段记录开发访问时间,然后相减。可以得到停留时间。
      

  12.   

    Mark.我以前也是这样写的,但是我是固定在一个页面里,这个页面定时刷新。
    没有搂住这个方法好,但是我的简单,只需一个文件。
    搂住的要在多个文件里操作。
      

  13.   

    TO:hiying
     你这样要每个页里都要包含一个页刷新?
    我这个不需要每个页都处理啊。只需要放在Global.asax中就可以了。
      

  14.   

    哦,understand.俺想的是在asp下的实现,呵呵,asp里面没有Application_BeginRequest这个事件。多谢