【问题标题】:Should stored procedures be called in OnInit, OnLoad, or OnPreRender?应该在 OnInit、OnLoad 或 OnPreRender 中调用存储过程吗?
【发布时间】:2016-01-20 15:11:52
【问题描述】:

我有一个典型的RadAjaxLoadingPanel,它在按钮单击方法调用Response.Redirect 时触发。重定向页面在OnLoad 方法中有几个昂贵 存储过程。这似乎锁定了 UI,并且圆圈冻结,直到这些存储过程完成。这些存储过程是否应该保留在OnLoad 方法中?加载防止 UI 锁定的Response.Redirect 时是否有更好的实现?

protected void Button_Click(object sender, EventArgs e)
{
    Response.Redirect("~/page.aspx", false);
}

【问题讨论】:

  • 除非我误解了您的问题,否则您的标题中的所有三个事件都需要在页面完全呈现之前完成。也许您需要在目标页面上使用 ajax 面板来异步加载数据,以便您至少可以显示“数据加载...”消息或死亡纺车以外的其他内容?
  • “贵”有多贵?一般来说,如果某件事花费的时间超过几秒钟,它应该是background task。
  • @mason 我要说同样的话。修复 - 如果您想在不冻结 UI 的情况下运行长时间运行的进程,后台任务/调度程序可能是一个不错的选择。
  • @Mason 鉴于当天 VPN 的运行情况,有时 20 到 40 秒的时间很贵。
  • 我们对您的整个应用程序了解有限,因此很难知道如何提出最佳修复建议。但是,如果页面需要来自这些存储过程的数据,那么对它们的调用是在 OnInit、OnLoad 还是 OnPreRender 中并不重要。一些选项:首先,您是否尝试过优化和调整查询?您是否正确索引了表格?任何需要这么长时间才能运行的查询都很难闻。其次,是否可以以某种方式缓存数据,这样您就不必每次页面加载时都去数据库?

标签: c# asp.net .net stored-procedures radajaxloadingpanel


【解决方案1】:

这样做。 通过 Management Studio 或您用于连接数据库的任何设计器程序运行存储过程。这个手术需要多长时间?

现在导航到您的程序设置一个后台进程来处理存储过程的工作 - 但在您调用存储过程的函数中确保有一个返回行:

return [something];

也许您希望函数或方法返回一个列表或一个值?您必须在存储过程运行时将某些内容返回到视图,以免您的过程被阻止。

比较程序中操作的执行时间与直接从数据库中执行的时间。在我看来,无论您的存储过程需要多长时间,如果视图中需要它在 OnInit、OnLoad 或 OnPreRender 中初始化它都无关紧要。

【讨论】:

    猜你喜欢
    • 2010-11-24
    • 2013-11-23
    • 2020-01-14
    • 2011-01-26
    • 2014-01-11
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    相关资源
    最近更新 更多