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里,也是这种情况,老是丢失。各位高人有没有人知道是怎么回事的,要怎么解决这个问题呢?
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里,也是这种情况,老是丢失。各位高人有没有人知道是怎么回事的,要怎么解决这个问题呢?
解决方案 »
- 帮我看一下这一段前后台混杂的代码怎么写才是对的,谢谢!
- fck高度问题
- C#读取Excel,如果Excel表中的名字Sheet1 这个如果变了怎么办?
- repeater的linkbutton中删除数据问题?(在线等)
- 写了一个简单的在线客服的程序
- 关于三层结构的简单问题,问题简单,所以分不给多了
- 服务器端的事件的变化如何及时通知到打开的浏览器网页?
- 异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。 请教,谁知道这是怎么回事啊?
- 如何用ASP.net+c#制作网页模板,能使用户可以自已修改模板来改变网站风格
- 那为大侠有Visual Studio 2005的下载地址包含MSDN2005
- 这样的日历怎么实现,请高手给个例子
- 原来在vs上做的网站项目,因为系统重装,vs也重装,现在该如何打开原来做好了的网站项目?
服务器配置
CPU:双Xeon 2G
内存: 4G
硬盘可用空间:200G
C盘: 50G
<frame src="aa.aspx?参数1=参数1&参数2=参数2">
用application 或者viewstate1。原先dtOnline我是存在Application里,也是这种情况,老是丢失。
2。ViewState 老大不是开玩笑吧,呵呵
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的问题,是你自己程序有问题.
{
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);
}
for zjsen(星愿)(个人观点,仅供参考.请自行验证):
你的程序中的网页是不是都继承自pagebase?
如果这样,那是你程序的逻辑有问题,你每个页面(不是每次用户请求的页面)都有这两个静态变量,比如有a.aspx,b.aspx .a.aspx里datatable加了一条记录,这并不能反应到b.aspx中,因为b.aspx自己也有这两个变量,并且你在a.aspx里做增记录时并没有对b.aspx做这样的操作,如果这样你要在b.aspx的datatabel中取用户信息怎么取得到?这不是asp.net的问题,是你自己程序有问题.
==============================================================================大哥你先弄清静态变量是怎么回事再说话行不!!
不管有多少个继承,静态变量都是唯一的
你搞清楚什么是实例化,什么是继承了吗?
事实胜于雄辩:
你给basepage增加一个:public static int fld;
然后增加两个页,a.aspx,b.aspx继承自basepage
你先调用a.aspx里让fld=1,
然后调用b.aspx里fld=2;
再回到a.aspx,看看fld是多少
{
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()
{ }
}
}运行一下看看吧,
拜托你自己先验证一下,再说好不好
这是个在整个基于web的应用程序中保存个人用户状态的问题。
zjsen(星愿)(个人观点,仅供参考.请自行验证)讲的,如果把静态变量存入global.asax里,那么任何一个页面都可以读取这个变量值,但是,楼主要的效果好像是每个人登陆系统后这个静态变量应该不同。
可以用session的方法去存储,为了避免数据在session过期时丢失,可以在页面基类里写一个小窗口,在页面内隐藏刷新,以保持session状态。另外,也可以基于sql server的状态保存方式,这比较适用有大规模用户群的方式。
{
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()看看
大哥你在类的构造函数里把静态变量都设为空了,当然是这种效果了,这更证明了是存在一个地方了,不信你把test改成如下: public string test()
{
c1 cc1=new c1();
cc1.SetStr( "abc ");
c2 cc2=new c2();
return cc1.GetStr();
}
返回的肯定是"",
因为每个客户端每隔 10秒就查询一下有没有发给他的消息。用数据库的话太频繁了for zhenwang(自由梦想):
===========================================
应该说,web是一个无状态的东东,你能这样凭想象的在静态变量里存入数据。服务端不会保存的。
====================================================
为什么不会保存?给个理由。========================================
可以用session的方法去存储,为了避免数据在session过期时丢失,可以在页面基类里写一个小窗口,在页面内隐藏刷新,以保持session状态。
=======================================
Session只是针对当前用户的,难道我要给其他人发消息要存在自己的Session里,那其他人怎么读这个Session????
谢谢你的建议,但是我现在只想赶快把这个dtOnline丢失的问题搞好
Application_Start时初始的静态变量
除非Application_End了,静态变量是一直存在的
如果用数据库保存,速度跟不上,毕竟类和数据库在存储上是有区别的,也许是我结构设计不佳,才会有如此问题。楼主和各位高手如果好的经验,还请不吝赐教啊。
以上情况只是个人经验,没有权威论据支持。
对对!!和我的情况一样,我怀疑Static变量和Application在服务端是一样的。
for Alexandria(Zekee是我的姓) :
=======================================================================
关于你对静态变量的解释“除非Application_End了,静态变量是一直存在的”,可能是我不了解。如果对web.config、global.ascx的改动,比如杀毒软件的扫描,都有可能造成application重启,
======================================================================
是你说得对,可是重起会调用Application_start那么就会初始化dtOnline了。===================================================
你说的dtOnline丢失是指整张表的丢失还是某几条数据的丢失?有没有在测试环境中看看是否每2天就会丢失?表中每天的信息量是多大?有没有写个监控程序来tracking?监控所有的insert、delete。===============================
测出来有什么用,还是没发解决阿
比如你可以在application_end()里面保存dtOnline为文件或存入数据库,看看结果呀,否则
你的“丢失”只能是大家在这里的猜测。现在的问题是还没到application_end()dtOnline就丢失了
我在网上给你传纸条,肯定系统就已经知道你是谁了,至少你有一个唯一的id来表示,我把纸条内容提交后,系统直接记录到你的“纸条表”中,下次,你登录的时候直接从数据库中取出来不就行了吗?这仅仅涉及到操作数据库,不需要什么静态变量的问题,为什么要用不容易实现的方法去做呢?
=====================================================================
我在网上给你传纸条,肯定系统就已经知道你是谁了,至少你有一个唯一的id来表示,我把纸条内容提交后,系统直接记录到你的“纸条表”中,下次,你登录的时候直接从数据库中取出来不就行了吗?
=====================================================================
主要是实时性问题要求在10秒内接收人能收到纸条,你想同时在线300人,每个人每个10秒就查询一次数据库是不是太频繁了点
是啊,可是每个人都是无时无刻(每隔10秒)在查询有没有发给自己的纸条啊
聊天室是这么做的吗?怀疑ing~~~~~~~
如果想重启IIS都不丢数据只能做到数据库中了。我没想重起IIS不丢数据,我只想在IIS重起之前不丢数据