0

私は最初のより大きなasp.net Webサイトを持っており、オンラインのすべてのユーザーのユーザーリストがあります-もちろん、このリストはすべてのユーザーで同じですが、通常のオンラインリストとして、10秒ごとにPageMethod / WebMethodでこれを更新します. したがって、100 人のユーザーがオンラインの場合、10x6x100 = 1 分あたり 6000 のデータベース クエリを意味します。

どうすればそれを回避できますか? すべてのユーザーのこの情報をセッション/クエリ文字列/クッキーのようなものに保存できますが、クエリを回避するためにすべてのユーザーに対してグローバルに保存できますか?

4

2 に答える 2

1

最も簡単な方法は、必要な情報を保持するアプリケーション変数または DataTable を作成することです。

10 分ごとにレコードを更新するときは、上記で作成したアプリケーション データテーブルを更新するだけです。この DataTable はすべてのユーザーに共通であり、負荷が大幅に軽減されます。

コードが必要な場合はお知らせください。

于 2013-10-26T09:20:06.553 に答える
0

これには静的変数を使用できます。サーバーページへのアプリプールが複数ある場合は、静的変数はスレッドセーフではないため、asp.net キャッシュを使用します。

これは、2つのクラスを持つ同様のものに使用する私のコードです。クラス1

  using System;

   public class onlineuser
   {
     public string sessionid = "";
     public string username = "";
     public string currentpage = "";
     public DateTime time = DateTime.Now;
public onlineuser()
{
    //
    // TODO: Add constructor logic here
    //
}

}

クラス2

 using System;
 using System.Collections;
 using System.Data;


 public class user
 {
 public static ArrayList online;

 public static void adduser(string sessionid,string username,string currentpage)
 {
      removeunused();
      remove(sessionid);
      onlineuser ou = new onlineuser();
      ou.sessionid = sessionid;
      ou.username = username;
      ou.currentpage = currentpage;
      ou.time = DateTime.Now;
      if (online==null)
      {
           online = new ArrayList();
      }
      online.Add(ou);
      online.TrimToSize();

 }
 public static void remove(string sessionid)
 {
      if (online==null)
      {
           return;
      }
      onlineuser ou = new onlineuser();
      for (int i = 0; i < online.Count; i++)
      {
           ou = (onlineuser)online[i];
           if (ou.sessionid == sessionid)
           {
                online.RemoveAt(i);
                online.TrimToSize();
                return;
           }
      }
 }
 public static void removeunused()
 {
      if (online == null)
      {
           return;
      }
      onlineuser ou = new onlineuser();
      for (int i = 0; i < online.Count; i++)
      {
           ou = (onlineuser)online[i];
           if (ou.time < DateTime.Now.AddMinutes(-2))
           {
                online.RemoveAt(i);
                online.TrimToSize();
                return;
           }
      }
 }
 public static DataTable totable()
 {
      DataTable dt = new DataTable();
      DataColumn dc = new DataColumn("SessionId", typeof(string));
      DataColumn dc1 = new DataColumn("UserName", typeof(string));
      DataColumn dc2 = new DataColumn("currentpage", typeof(string));
      DataColumn dc3 = new DataColumn("Time", typeof(DateTime));
      dt.Columns.Add(dc);
      dt.Columns.Add(dc1);
      dt.Columns.Add(dc2);
      dt.Columns.Add(dc3);
      if (online!=null)
      {
           onlineuser ou = new onlineuser();
      for (int i = 0; i < online.Count; i++)
      {
           ou = (onlineuser)online[i];
          dt.Rows.Add(new object[] {ou.sessionid,ou.username,ou.currentpage,ou.time});
      }
      }
      return dt;
 }

}

次のコードは、ユーザーリストを更新する mymaster ページに配置されます

   try
     {
          string uname= "N/A";
     if (Session["uname"]!=null)
     {
          uname = Session["uname"].ToString();
     }
     string page = Path.GetFileName(Request.PhysicalPath).Trim().ToLower();
     if (Request.QueryString!=null)
     {
          page += "?"+Request.QueryString.ToString();
     }
     user.adduser(Session.SessionID, uname, page);
     }
     catch (Exception)
     {


     }
于 2013-10-26T09:18:34.593 に答える