本人做的一个“系统消息提示”,用的一个长轮循实现。单独的一个SqlConnection,其它的功能又用的另一个SqlConnettion
系统的使用人数大致在60-100左右。
现在的情况的是:有时用着用着,系统会提示出错。多刷新几次,就又正常了。
出错的原因是:提示得很乱,本人初步判断是原因是轮循的链接,同时触发太多,影响了正常功能应用的链接。
sql操作类用的网上下的DBHelper。本人看了下代码没问题。
当把消息提醒功能关闭,系统不会出错。
讨教下这个问题应该怎么处理。
轮循的主要代码
int SendTime = 0; //最多等待时间
string eid = Common.Const.GetF(“eid”);//要查询的用户
int.TryParse(Common.Const.GetF(“time”), out SendTime);
int i = 0;//计算超时时间(秒)
while (true)
{
Thread.Sleep(5000);//停留五千毫秒(5秒),以用这个等待时间达到长轮询
i++;
if (i < SendTime)
{
if (eid != “”)
{
lock (this)
{
string strWhere = ” receiverId=” + eid + ” and isRead=0″;
int newmsg = Common.DBHelper.GetRecordCount_msg(“OA_SysMsg”, strWhere);
if (newmsg != 0)
{
context.Response.Write(newmsg);
break;
}
}
}
}
if (i == SendTime)
{
context.Response.Write(“fail:无数据”);
break;
}
}
数据查询方法
public static int GetRecordCount_msg(string TableName, string StrWhere)
{
SqlConnection conn_msg;
conn_msg = new SqlConnection();
conn_msg.ConnectionString = ConfigurationManager.ConnectionStrings[“ConnectionString”].ConnectionString;
系统的使用人数大致在60-100左右。
现在的情况的是:有时用着用着,系统会提示出错。多刷新几次,就又正常了。
出错的原因是:提示得很乱,本人初步判断是原因是轮循的链接,同时触发太多,影响了正常功能应用的链接。
sql操作类用的网上下的DBHelper。本人看了下代码没问题。
当把消息提醒功能关闭,系统不会出错。
讨教下这个问题应该怎么处理。
轮循的主要代码
int SendTime = 0; //最多等待时间
string eid = Common.Const.GetF(“eid”);//要查询的用户
int.TryParse(Common.Const.GetF(“time”), out SendTime);
int i = 0;//计算超时时间(秒)
while (true)
{
Thread.Sleep(5000);//停留五千毫秒(5秒),以用这个等待时间达到长轮询
i++;
if (i < SendTime)
{
if (eid != “”)
{
lock (this)
{
string strWhere = ” receiverId=” + eid + ” and isRead=0″;
int newmsg = Common.DBHelper.GetRecordCount_msg(“OA_SysMsg”, strWhere);
if (newmsg != 0)
{
context.Response.Write(newmsg);
break;
}
}
}
}
if (i == SendTime)
{
context.Response.Write(“fail:无数据”);
break;
}
}
数据查询方法
public static int GetRecordCount_msg(string TableName, string StrWhere)
{
SqlConnection conn_msg;
conn_msg = new SqlConnection();
conn_msg.ConnectionString = ConfigurationManager.ConnectionStrings[“ConnectionString”].ConnectionString;
string strsql = “select Count(*) from ” + TableName;
if (StrWhere != “”)
{
strsql += ” where ” + StrWhere;
}
SqlCommand cmd_msg = conn_msg.CreateCommand();
conn_msg.Open();
try
{
cmd_msg.CommandText = strsql;
object obj = cmd_msg.ExecuteScalar();
conn_msg.Close();
if (obj == null)
{
return 0;
}
else
{
return int.Parse(obj.ToString());
}
}
finally {
conn_msg.Close();
}
}
解决方案
25
当你写一个大的 while 循环的时候,你可能在结构化方面做的就不够好。
既然5秒钟定时启动任务,为什么不使用 Timer 驱动呢?当你使用 Timer 驱动,你的代码(原因是结构化面向”短“过程的原因)自然就会迅速释放该释放的各种资源。5秒钟之后跟5秒钟之前,中间空闲时间,不会 hang 住多余资源而不释放。
写 while 语句,要想想更深层的问题。写一个大大的 while循环作为主程序,这类代码的通常都是刚毕业的学生。
既然5秒钟定时启动任务,为什么不使用 Timer 驱动呢?当你使用 Timer 驱动,你的代码(原因是结构化面向”短“过程的原因)自然就会迅速释放该释放的各种资源。5秒钟之后跟5秒钟之前,中间空闲时间,不会 hang 住多余资源而不释放。
写 while 语句,要想想更深层的问题。写一个大大的 while循环作为主程序,这类代码的通常都是刚毕业的学生。
1
说实话,没看懂你要干什么?
你系统消息用什么传输?看代码貌似直接用数据库记录,假如是这样本人想问你到底想实现什么功能?
对全体发消息?
对在线人员发消息?
对特定人员发消息?
还有你这代码到底用在那里?客户端?服务器端?用的是bs还是cs?
你系统消息用什么传输?看代码貌似直接用数据库记录,假如是这样本人想问你到底想实现什么功能?
对全体发消息?
对在线人员发消息?
对特定人员发消息?
还有你这代码到底用在那里?客户端?服务器端?用的是bs还是cs?
10
问题出在架构设计上,轮询和业务加在一起要建立数百个sql连接对任何数据库都是不小的压力。
1
哦,bs滴。怎么回写成上面那样滴。
bs滴要不就是websocket,要不就是ajax。那有什么while滴地方。
bs滴要不就是websocket,要不就是ajax。那有什么while滴地方。
1
ashx里面用while+sleep能循环输出??
这已经超出http的本意了吧 ….
这已经超出http的本意了吧 ….
1
说实话,及时通讯是个力气活。
你这个方式人多了,肯定不行,但是想顺畅的话,估计你们项目的费用也支撑不了。
你这个方式人多了,肯定不行,但是想顺畅的话,估计你们项目的费用也支撑不了。
1
用settimeout +ajax来弄吧