鹅用的是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 " ;
}
}
}
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 " ;
}
}
}