【发布时间】:2018-05-09 20:56:28
【问题描述】:
我们有一个网站存在性能问题,存储过程执行是瓶颈。造成这种情况的原因之一是其中一些存储过程在页面加载时启动。
假设数据库负载很高,用户对页面上的报告加载时间感到沮丧,并反复刷新页面,开始执行同一存储过程的新执行。
这是我们用来执行存储过程和管理连接的代码:
using (SqlCommand cmd = CreateCommand(qry, CommandType.StoredProcedure, args))
{
SqlDataAdapter adapt = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapt.Fill(ds);
return ds;
}
即使用户离开页面或刷新页面,旧的执行仍会访问数据库,从而产生新的执行。
两种可能的解决方案:
- 当生成存储过程的用户离开本应显示的页面时,以某种方式终止存储过程的执行。
- 更进一步,尝试保持相同的连接实例,这样如果用户点击相同的页面,它将等待上一个存储过程的结果,然后将这些结果显示在页面上。
这些事情的常见做法是什么,它们是如何实施的?当用户离开调用它的页面时,我如何至少杀死存储过程?
【问题讨论】:
-
如何检测用户离开?您需要将某种取消令牌发送到 asp.net 来处理
-
如果您无法修复报告的性能,请考虑使用队列或类似系统。如果您确实需要检测断开连接,可以考虑使用信号器类型的场景,在该场景中,在从队列中执行长时间运行的报告任务之前检查用户是否还活着。
-
@JoePhillips 我不知道。我是前端工作的新手,所以我考虑了这个问题的这一部分。
标签: c# sql asp.net sql-server