Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 如何为所有用户缓存全局信息?_Asp.net_Sql - Fatal编程技术网

Asp.net 如何为所有用户缓存全局信息?

Asp.net 如何为所有用户缓存全局信息?,asp.net,sql,Asp.net,Sql,我有我的第一个更大的asp.net网站,并且有所有在线用户的用户列表-当然这个列表对于每个用户都是相同的,但是作为一个普通的在线列表,我每10秒用PageMethod/WebMethod更新一次。 因此,如果100个用户在线,这意味着每分钟10x6x100=6000个数据库查询 我怎样才能避免呢? 我是否可以将所有用户的此信息保存在session/querystring/cookie中,但对所有用户都是全局的,以避免查询?您可以为此使用静态变量。如果您有多个应用程序池连接到serverpages

我有我的第一个更大的asp.net网站,并且有所有在线用户的用户列表-当然这个列表对于每个用户都是相同的,但是作为一个普通的在线列表,我每10秒用PageMethod/WebMethod更新一次。 因此,如果100个用户在线,这意味着每分钟10x6x100=6000个数据库查询

我怎样才能避免呢?
我是否可以将所有用户的此信息保存在session/querystring/cookie中,但对所有用户都是全局的,以避免查询?

您可以为此使用静态变量。如果您有多个应用程序池连接到serverpages 然后使用asp.net缓存,因为静态变量不是线程安全的

这是我的代码,我用它来做类似的事情,它有2个类。 第一类

}

类别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;
 }

最简单的方法是创建一个应用程序变量或DataTable,它将保存您所需的信息

每10分钟之后,当您更新记录时,只需更新上面创建的应用程序数据表。此数据表对于所有用户都是通用的,这将大大减少您的负载


如果您需要代码,请告诉我。

不,我的IIS中只有一个应用程序池,如果您的意思是。。。你能在这里带来一些代码吗?线程安全仍然是一个问题,只有一个应用程序池,它仍然可以同时服务多个请求。这个代码示例没有考虑到这一点。@simon你能用一个示例来说明你认为这个代码什么时候会崩溃吗?我将改变这一点。您的adduser方法可能有一个线程添加用户,而另一个线程重新创建数组列表,忘记了第一个线程做了什么。当另一个方法对集合进行迭代时,您的remove方法可能会更改集合,它甚至可能会删除错误的项,因为它删除的索引可能是错误的。
 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;
 }
   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)
     {


     }