public class PageBase:System.Web.UI.Page
   public static UseUnit UseUnitInfo;
   public static DataTable dtOnline;如上PageBase类里有两个静态变量,
UseUnitInfo 存的是使用单位的信息
dtOnline存的是在线传纸条的内容结构如下:
dtOnline=new DataTable();
dtOnline.Columns.Add("SenderID",System.Type.GetType("System.Int32"));
dtOnline.Columns.Add("Msg",System.Type.GetType("System.String"));
dtOnline.Columns.Add("SendTime",System.Type.GetType("System.DateTime"));
dtOnline.Columns.Add("UserID",System.Type.GetType("System.Int32"));
DataColumn dc=dtOnline.Columns.Add("ID",System.Type.GetType("System.Int32"));
dc.AutoIncrement=true;
dc.AutoIncrementSeed=1;
dc.AutoIncrementStep=1;
同时在线的人数大约300人左右,传纸条时会把信息存在这个表里,接收人读过以后会自动删除已读的信息。现在的问题是:IIS重起后大约2天dtOnline就会丢失,而UseUnitInfo却很正常,
原先dtOnline我是存在Application里,也是这种情况,老是丢失。各位高人有没有人知道是怎么回事的,要怎么解决这个问题呢?

解决方案 »

  1.   

    忘了说了:
    服务器配置
    CPU:双Xeon 2G 
    内存: 4G
    硬盘可用空间:200G
    C盘: 50G
      

  2.   

    没有关系的
    <frame src="aa.aspx?参数1=参数1&参数2=参数2">
      

  3.   

    for:zhanqiangz(闲云野鹤) 
     
       用application 或者viewstate1。原先dtOnline我是存在Application里,也是这种情况,老是丢失。
    2。ViewState 老大不是开玩笑吧,呵呵
      
     
      

  4.   

    public static UseUnit UseUnitInfo;
       public static DataTable dtOnline;
    --------------------------
    放到gloab中,在application_start事件中初始化datatable;你的程序中的网页是不是都继承自pagebase?
    如果这样,那是你程序的逻辑有问题,你每个页面(不是每次用户请求的页面)都有这两个静态变量,比如有a.aspx,b.aspx .a.aspx里datatable加了一条记录,这并不能反应到b.aspx中,因为b.aspx自己也有这两个变量,并且你在a.aspx里做增记录时并没有对b.aspx做这样的操作,如果这样你要在b.aspx的datatabel中取用户信息怎么取得到?这不是asp.net的问题,是你自己程序有问题.
      

  5.   

    新建一个类public static class OnlineManager
    {
       public static UseUnit UseUnitInfo;
       public static DataTable dtOnline;   /////可以封装部分逻辑,比如添加信息、删除信息
       ///比如: public static void SendMessage(Message message);
       ///       public static void DeleteMessage(string messageID);
       ///       public static void ReadMessage(string messageID);
    }
      

  6.   

    ================================================================================
    for  zjsen(星愿)(个人观点,仅供参考.请自行验证):
    你的程序中的网页是不是都继承自pagebase?
    如果这样,那是你程序的逻辑有问题,你每个页面(不是每次用户请求的页面)都有这两个静态变量,比如有a.aspx,b.aspx .a.aspx里datatable加了一条记录,这并不能反应到b.aspx中,因为b.aspx自己也有这两个变量,并且你在a.aspx里做增记录时并没有对b.aspx做这样的操作,如果这样你要在b.aspx的datatabel中取用户信息怎么取得到?这不是asp.net的问题,是你自己程序有问题.
    ==============================================================================大哥你先弄清静态变量是怎么回事再说话行不!!
    不管有多少个继承,静态变量都是唯一的
      

  7.   

    靜态变量是在一个特定的类中,相对于这个类实例出来的对象是唯一的。
    你搞清楚什么是实例化,什么是继承了吗?
    事实胜于雄辩:
    你给basepage增加一个:public static int fld;
    然后增加两个页,a.aspx,b.aspx继承自basepage
    你先调用a.aspx里让fld=1,
    然后调用b.aspx里fld=2;
    再回到a.aspx,看看fld是多少
      

  8.   

    using System;namespace ConsoleApplication2
    {
     
    class Class1
    { static void Main(string[] args)
    {
    cls.AddCount();
    Console.Write(cls.intcount.ToString());
    Console.Write(clssub.intcount.ToString());
    clssub.AddCount();
    Console.Write(cls.intcount.ToString());
    Console.Write(clssub.intcount.ToString());
    }
    } public class cls
    {
    public static int intcount;
    public cls()
    { }
    public static void AddCount()
    {

    intcount++;
    }
    }
    public class clssub: cls
    {
    public clssub()
    { }
    }
    }运行一下看看吧,
      

  9.   

    for  zjsen(星愿)(个人观点,仅供参考.请自行验证) :
    拜托你自己先验证一下,再说好不好
      

  10.   

    应该说,web是一个无状态的东东,你能这样凭想象的在静态变量里存入数据。服务端不会保存的。
    这是个在整个基于web的应用程序中保存个人用户状态的问题。
     zjsen(星愿)(个人观点,仅供参考.请自行验证)讲的,如果把静态变量存入global.asax里,那么任何一个页面都可以读取这个变量值,但是,楼主要的效果好像是每个人登陆系统后这个静态变量应该不同。
    可以用session的方法去存储,为了避免数据在session过期时丢失,可以在页面基类里写一个小窗口,在页面内隐藏刷新,以保持session状态。另外,也可以基于sql server的状态保存方式,这比较适用有大规模用户群的方式。
      

  11.   

    public class baseclass
    {
    public static string str;
    }
    public class c1:baseclass
    {
    static c1()
    {
    str="";
    }
    public void SetStr(string s)
    {
    str=s;
    }
    public string GetStr()
    {
    return str;
    }
    }
    public class c2:baseclass
    {
    static c2()
    {
    str="";
    }
    public void SetStr(string s)
    {
    str=s;
    }
    public string GetStr()
    {
    return str;
    }
    } public class testclass
    {
    public testclass()
    {
    }
    public string test()
    {
    c1 cc1=new c1();
    cc1.SetStr("abc");
    c2 cc2=new c2();
    return cc2.GetStr();
    }
    }
    -------------------------------------
    你调用test()看看
      

  12.   

    for zjsen(星愿)(个人观点,仅供参考.请自行验证) ():
    大哥你在类的构造函数里把静态变量都设为空了,当然是这种效果了,这更证明了是存在一个地方了,不信你把test改成如下:  public  string  test()  
                           {  
                                       c1  cc1=new  c1();  
                                       cc1.SetStr(  "abc  ");  
                                       c2  cc2=new  c2();  
                                       return  cc1.GetStr();                          
                           }  
    返回的肯定是"",
      

  13.   

    for  wyfwyf2000(讨分-多多益善):
    因为每个客户端每隔 10秒就查询一下有没有发给他的消息。用数据库的话太频繁了for zhenwang(自由梦想):
    ===========================================
    应该说,web是一个无状态的东东,你能这样凭想象的在静态变量里存入数据。服务端不会保存的。
    ====================================================
    为什么不会保存?给个理由。========================================
    可以用session的方法去存储,为了避免数据在session过期时丢失,可以在页面基类里写一个小窗口,在页面内隐藏刷新,以保持session状态。
    =======================================
    Session只是针对当前用户的,难道我要给其他人发消息要存在自己的Session里,那其他人怎么读这个Session????
      

  14.   

    你可以在Application_Start/End的时候,加入对UseUnitInfo和dtOnline的持久化支持,比如在Application_End的时候把它们序列化成XML文档存储,下次Application_Start的时候从XML反序列化,恢复现场
      

  15.   

    for Miracle(新一代的开山怪) :
    谢谢你的建议,但是我现在只想赶快把这个dtOnline丢失的问题搞好
      

  16.   

    jywwm,我有个问题,你用静态变量我没意见,毕竟所有用户都可以读取和修改它,但是,如果有那么一个时刻,没有一个用户去访问你的web application或者说打开这个页面,是不是这个静态变量就没了?下一个用户看来是不是就回到了default?
      

  17.   

    for Alexandria(Zekee是我的姓):
    Application_Start时初始的静态变量
    除非Application_End了,静态变量是一直存在的
      

  18.   

    关于你对静态变量的解释“除非Application_End了,静态变量是一直存在的”,可能是我不了解。如果对web.config、global.ascx的改动,比如杀毒软件的扫描,都有可能造成application重启,但我觉得UseUnit也应该同时丢失才对。
      

  19.   

    你说的dtOnline丢失是指整张表的丢失还是某几条数据的丢失?有没有在测试环境中看看是否每2天就会丢失?表中每天的信息量是多大?有没有写个监控程序来tracking?监控所有的insert、delete。
      

  20.   

    虽然说放在Application中的咚咚不会丢失,但是我验证下来并非如此,主要原因是传值还是传址,如果放的是一个字符串,没有问题,但如果是类的引用,会被自动清理(内存不够时),但是指针不会被清理。我的Web程序中Application放了大量的公共类,发现经常不见了,但引用还在,所以报错:未将引用。到类的实例(类中又引用了其他类的时候)
    如果用数据库保存,速度跟不上,毕竟类和数据库在存储上是有区别的,也许是我结构设计不佳,才会有如此问题。楼主和各位高手如果好的经验,还请不吝赐教啊。
    以上情况只是个人经验,没有权威论据支持。
      

  21.   

    for shangwg(shangwg):
    对对!!和我的情况一样,我怀疑Static变量和Application在服务端是一样的。
    for Alexandria(Zekee是我的姓) :
    =======================================================================
    关于你对静态变量的解释“除非Application_End了,静态变量是一直存在的”,可能是我不了解。如果对web.config、global.ascx的改动,比如杀毒软件的扫描,都有可能造成application重启,
    ======================================================================
    是你说得对,可是重起会调用Application_start那么就会初始化dtOnline了。===================================================
    你说的dtOnline丢失是指整张表的丢失还是某几条数据的丢失?有没有在测试环境中看看是否每2天就会丢失?表中每天的信息量是多大?有没有写个监控程序来tracking?监控所有的insert、delete。===============================
    测出来有什么用,还是没发解决阿
      

  22.   

    比如你可以在application_end()里面保存dtOnline为文件或存入数据库,看看结果呀,否则你的“丢失”只能是大家在这里的猜测。
      

  23.   

    for Alexandria(Zekee是我的姓):
    比如你可以在application_end()里面保存dtOnline为文件或存入数据库,看看结果呀,否则
    你的“丢失”只能是大家在这里的猜测。现在的问题是还没到application_end()dtOnline就丢失了
      

  24.   

    且,这么一个小问题真的这么难解决吗?楼主,你的意思到底是想实现什么样的功能?是不是就像chinaren.com里面的可以在同学之间互相传送小纸条?为什么非要用什么静态变量去实现呢?
    我在网上给你传纸条,肯定系统就已经知道你是谁了,至少你有一个唯一的id来表示,我把纸条内容提交后,系统直接记录到你的“纸条表”中,下次,你登录的时候直接从数据库中取出来不就行了吗?这仅仅涉及到操作数据库,不需要什么静态变量的问题,为什么要用不容易实现的方法去做呢?
      

  25.   

    for zhenwang(自由梦想):
    =====================================================================
    我在网上给你传纸条,肯定系统就已经知道你是谁了,至少你有一个唯一的id来表示,我把纸条内容提交后,系统直接记录到你的“纸条表”中,下次,你登录的时候直接从数据库中取出来不就行了吗?
    =====================================================================
    主要是实时性问题要求在10秒内接收人能收到纸条,你想同时在线300人,每个人每个10秒就查询一次数据库是不是太频繁了点
      

  26.   

    for  whatandwhy(天黑):
    是啊,可是每个人都是无时无刻(每隔10秒)在查询有没有发给自己的纸条啊
      

  27.   

    for whatandwhy(天黑) :
    聊天室是这么做的吗?怀疑ing~~~~~~~
      

  28.   

    如果想重启IIS都不丢数据只能做到数据库中了。
      

  29.   

    for  eboywy(飞影) :
    如果想重启IIS都不丢数据只能做到数据库中了。我没想重起IIS不丢数据,我只想在IIS重起之前不丢数据
      

  30.   

    http://www.yoda.arachsys.com/csharp/faq