统计在线人数

鹅用的是AC数据库,曾经在ASP时代试验过,做的使用数据库临时表,人数上了100就比较艰难了(因为同时还在不停的查询另外个BANNER表所以实际上是上了200),后来我飒是费了点劲将数据表转换为多维数组放到APPLICATION里去然后间隔时间更新至数据库,得以缓解。现在而今眼目下鸟枪换炮了用.net可以直接把DataTable放到Application里面。很好。极大减少数据库压力了,尤其是我使用的AC数据库-_-!。至于要实现1个ID1个登陆只要查询表中是否有该用户名的记录就可以了。
还没完善目前还在调试修正中。。。

在BasePage或每个页中加入(new ZKXP.BLL()).CheckOnline()即可。
要获得数据表使用DataTable dt = (DataTable)Application["OnlineTable"]

 

using  System;
using  System.Data;
using  System.Text;

namespace  ZKXP.BLL
{
    
///   <summary>
    
///  OnLine 的摘要说明。
    
///   </summary>
     public   class  OnLine
    {    
        
private   string  USERNAME;
        
private   int  OFFLINEDIFF;
        
private   int  REMOVEDIFF;
        

        
public  OnLine()
        {
            
// 直接在这里设定、或从配置文件中读取配置参数
             /// 存放用户名的Session名
            USERNAME  =   " UserName " ;
            
/// 多少分钟不活动的用户从在线列表中删除
            OFFLINEDIFF  =   5 ;
            
/// 多少秒执行一次删除不活动用户
            REMOVEDIFF  =   30 ;
            
            
if (System.Web.HttpContext.Current.Application[ " OnlineTalbe " ==   null )
            {
                
this .CashTableInit();
            }
        }

        
public   void  CheckOnline()
        {
            
// 从Application获取数据表、获取SessionID
            DataTable dtOnline;
            dtOnline 
=  (DataTable)System.Web.HttpContext.Current.Application[ " OnlineTalbe " ];
            
string  sessionId  =  System.Web.HttpContext.Current.Session.SessionID.ToString();
            
            
// 数据表中是否有我的记录
            DataRow drFind  =  dtOnline.Rows.Find(sessionId);
            
if (drFind  !=   null )
            {
                
// 有;更新我的状态
                Info.Write( " 更新 " );
                drFind[
" LastActiveTime " =  DateTime.Now;
                drFind[
" UserWhere " =   this .AtWhere;
                
// 用户由访客状态变为了登陆会员、或反之
                 if (Extend.GetSession(USERNAME)  !=   null )
                {
                    drFind[
" VisitorName " =  Extend.GetSession(USERNAME);
                    drFind[
" VisitorLevel " =  Extend.GetSession( " UserLevel " );
                }
                
else
                {
                    drFind[
" VisitorName " =   " vst " ;
                    drFind[
" VisitorLevel " =   - 1 ;
                }    
            }
            
else
            {
                
// 无;加入关于我的在线信息
                Info.Write( " 插入 " );
                DataRow drNew 
=  dtOnline.NewRow();
                drNew[
" SessionID " =  sessionId;
                drNew[
" VisitorName " =   " vst " ;
                drNew[
" VisitorLevel " =   - 1 ;
                drNew[
" LastActiveTime " =  DateTime.Now;
                drNew[
" LoginTime " =  DateTime.Now;
                drNew[
" VisitorIP " =  Extend.GetRealIP();;
                drNew[
" UserWhere " =   this .AtWhere;
                
                dtOnline.Rows.Add(drNew);                
            }
            
// 如果没有人正在执行删除且离上次删除的时间间隔超过设定值
            TimeSpan tsRemove  =  DateTime.Now  -  Convert.ToDateTime(GetApplication( " LastRemove " ));
            
if (tsRemove.Seconds  >  REMOVEDIFF  &&   this .GetApplication( " Removing " ).ToString()  ==   " n " )
            {
                
// 锁定,我正在删除过期用户
                System.Web.HttpContext.Current.Application.Lock();
                SetApplication(
" Removing " " y " );
                System.Web.HttpContext.Current.Application.UnLock();
                
// 不知道Rows.Count是否随循环减少,如果是效率就大于foreach且这里不能使用foreach
                 for ( int  i = 0 ; i <  dtOnline.Rows.Count; i ++  )
                {
                    DataRow drDel 
=  dtOnline.Rows[i];
                    TimeSpan ts
=  DateTime.Now  -  Convert.ToDateTime(drDel[ " LastActiveTime " ]);
                    
if (ts.Minutes  >  OFFLINEDIFF)
                    {
                        dtOnline.Rows.Remove(drDel);
                    }
                }

                
// 我删完了,Response.Write("好累") ;
                System.Web.HttpContext.Current.Application.Lock();
                SetApplication(
" Removing " " n " );
                SetApplication(
" LastRemove " , DateTime.Now.ToString());
                System.Web.HttpContext.Current.Application.UnLock();
            }
            
            
// 把被我揉腻完了的数据表放回Application
            dtOnline.AcceptChanges();
            System.Web.HttpContext.Current.Application.Lock();
            System.Web.HttpContext.Current.Application[
" DataTalbeOnline " =  dtOnline;
            System.Web.HttpContext.Current.Application.UnLock();            
        }
        
private   string  GetApplication( string  apcname)
        {
            
return  System.Web.HttpContext.Current.Application[apcname].ToString();
        }
        
public   void  SetApplication( string  apcname,  string  apcvalue)
        {
            
            System.Web.HttpContext.Current.Application[apcname] 
=  apcvalue;
            
        }
        
///   <summary>
        
///  返回用户当前位置
        
///   </summary>
         private   string  AtWhere
        {
            
get
            {    System.Text.StringBuilder sb 
=   new  System.Text.StringBuilder();
                sb.Append(System.Web.HttpContext.Current.Request.ServerVariables[
" url " ]);
                
if (System.Web.HttpContext.Current.Request.ServerVariables[ " QUERY_STRING " !=  String.Empty)
                {
                    sb.Append(
" ? " );
                    sb.Append(System.Web.HttpContext.Current.Request.ServerVariables[
" QUERY_STRING " ]);
                }
                
return  sb.ToString() ;
            }
        }
        
///   <summary>
        
///  创建表
        
///   </summary>
         public   void  CashTableInit()
        {    
            DataTable dt 
=   new  DataTable( " OnlineTalbe " );
            dt.Columns.Add(
" SessionID " , typeof ( string ));
            dt.Columns.Add(
" VisitorName " typeof ( string ));
            dt.Columns.Add(
" VisitorLevel " typeof ( int ));
            dt.Columns.Add(
" LastActiveTime " typeof (DateTime));
            dt.Columns.Add(
" LoginTime " typeof (DateTime));
            dt.Columns.Add(
" VisitorIP " typeof ( string ));
            dt.Columns.Add(
" UserWhere " typeof ( string ));
            dt.Columns[
" SessionID " ].Unique  =   true ;
            dt.PrimaryKey 
=   new  DataColumn[]{dt.Columns[ " SessionID " ]};
                        
            System.Web.HttpContext.Current.Application[
" OnlineTalbe " =  dt;
            System.Web.HttpContext.Current.Application[
" LastRemove " =  DateTime.Now.ToString();
            System.Web.HttpContext.Current.Application[
" Removing " =   " n " ;
        }    
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值