长轮循实现,系统消息提醒,经常数据出错!

超级路灯 2016-07-21 03:54:55
我做的一个“系统消息提示”,用的一个长轮循实现。单独的一个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;

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();
}
}
...全文
184 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
mwp 2016-07-22
  • 打赏
  • 举报
回复
问题出在架构设计上,轮询和业务加在一起要建立数百个sql连接对任何数据库都是不小的压力。
正怒月神 2016-07-22
  • 打赏
  • 举报
回复
用settimeout +ajax来弄吧
mjp1234airen4385 2016-07-22
  • 打赏
  • 举报
回复
说实话,及时通讯是个力气活。 你这个方式人多了,肯定不行,但是想顺畅的话,估计你们项目的费用也支撑不了。
by_封爱 版主 2016-07-22
  • 打赏
  • 举报
回复
ashx里面用while+sleep能循环输出?? 这已经超出http的本意了吧 ....
wanghui0380 2016-07-22
  • 打赏
  • 举报
回复
哦,bs滴。怎么回写成上面那样滴。 bs滴要不就是websocket,要不就是ajax。那有什么while滴地方。
超级路灯 2016-07-22
  • 打赏
  • 举报
回复
引用 3 楼 wanghui0380 的回复:
说实话,没看懂你要干什么? 你系统消息用什么传输??看代码貌似直接用数据库记录,如果是这样我想问你到底想实现什么功能?? 对全体发消息?? 对在线人员发消息?? 对特定人员发消息?? 还有你这代码到底用在那里??客户端??服务器端??用的是bs还是cs??
实现消息提醒。 BS的
超级路灯 2016-07-22
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
你的“长轮循实现,系统消息提醒”这个标题其实写的是比较客观的。 但是系统消息提醒通常的设计目标是这样的:假设一个群组的一个人上线了,假设有15个人关注它(并且在线),那么这15人立刻收到系统 push 事件提醒。大一点的系统,假设一个“大V”上线了,他的20000名粉丝中有1500名粉丝在线,那么几乎是分成几组、几秒内,粉丝都会受到系统 push。 而客户端并不“长轮询”。服务器无需经受客户端如洪水一般的长轮询查询的冲击。 如果你的用户数量超过30个并发客户,请一定改为正规的系统消息提醒机制。不要再坚持搞“长轮询”。
针对这样的情况,那应该怎么从设计修改。以达到效果。 望指点!?
  • 打赏
  • 举报
回复
你的“长轮循实现,系统消息提醒”这个标题其实写的是比较客观的。 但是系统消息提醒通常的设计目标是这样的:假设一个群组的一个人上线了,假设有15个人关注它(并且在线),那么这15人立刻收到系统 push 事件提醒。大一点的系统,假设一个“大V”上线了,他的20000名粉丝中有1500名粉丝在线,那么几乎是分成几组、几秒内,粉丝都会受到系统 push。 而客户端并不“长轮询”。服务器无需经受客户端如洪水一般的长轮询查询的冲击。 如果你的用户数量超过30个并发客户,请一定改为正规的系统消息提醒机制。不要再坚持搞“长轮询”。
  • 打赏
  • 举报
回复
我们在面试一些实习生(例如培训学校托关系推荐的学员)时,经常遇到这样的人,它们说“我们的开发项目是做了一个QQ即时通讯系统”。稍微问他们点技术设计,就会“笑掉大牙”。原来所谓“仿QQ的即时通讯系统”就是界面的 png 图片像 QQ,而其它机制都是数据库“增删改查”。例如一个用户加好友是往数据库里增加一条记录,然后另一个用户轮询数据库于是查询出来“有人要求加我好友”了。等等这种逻辑还会有多个(例如收发聊天消息、用户上下线,等等)叠加在一起,那更加令人捧腹。 所以我告诉你,仅仅基于数据库,只能做点小办公室内几个用户的小 OA 还比较“爽”。做大的及时通讯系统,不是这样设计的,不是从数据库增删改查出发的技术架构。虽然涉及到数据的地方一定会“增上改查”,数据是所有软件的基础,但是不要以此为借口。
wanghui0380 2016-07-21
  • 打赏
  • 举报
回复
说实话,没看懂你要干什么? 你系统消息用什么传输??看代码貌似直接用数据库记录,如果是这样我想问你到底想实现什么功能?? 对全体发消息?? 对在线人员发消息?? 对特定人员发消息?? 还有你这代码到底用在那里??客户端??服务器端??用的是bs还是cs??
  • 打赏
  • 举报
回复
另外,如果你的“5秒钟轮询”是针对每一个用户都分别进行5秒钟轮询,那么这个就是一个比较差劲的设计。可能你的用户数量很少,所以不常出问题。随便放到一个大公司,假设业务人员做一次推广,到各大论坛、杂志去发文章,搞一次促销,总之用户数量增加一些,就可能一下子达到很多用户并发。 比如说1个人平均5秒钟访问一次系统,那么100个人就相当于每秒20次此类访问。假设在系统原本就比较慢的情况下,从5秒一次突增每秒20次访问,如果你的这个方法比较耗时,系统可能就垮了。更何况大公司可能要求要并发3000人才算是系统最低要求? 数据库操作非常耗费资源。好的系统尽量抛开数据库,达到“不落地”地处理业务。例如当事件发生时才推送给客户端,而不是客户端轮询服务器。 当然“抛开数据库”不是不存数据、不查询数据。而是思考设计软件架构的层次不一样。高性能的系统尽量不能让数据库操作的问题爆发到用户响应时间上,那就不能满脑子只有数据库增删改查,而是从通讯出发来设计系统架构。
  • 打赏
  • 举报
回复
当你写一个大的 while 循环的时候,你可能在结构化方面做的就不够好。 既然5秒钟定时启动任务,为什么不使用 Timer 驱动呢?当你使用 Timer 驱动,你的代码(因为结构化面向”短“过程的原因)自然就会迅速释放该释放的各种资源。5秒钟之后跟5秒钟之前,中间空闲时间,不会 hang 住多余资源而不释放。 写 while 语句,要想想更深层的问题。写一个大大的 while循环作为主程序,这类代码的通常都是刚毕业的学生。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧