c# - 调用同一个 sql server 2005 存储过程的多个 asp.net 请求

标签 c# asp.net sql-server-2005 tsql stored-procedures

在我开始之前,我找不到任何其他资源来回答我的问题,最接近的是:
Calling a stored procedure simultaniously from multiple threads in asp.net and sql server 2005
但它无法回答我的具体问题/疑虑。

基本上,我有一个庞大的 .net 网络应用程序,每天可以处理数百万个请求。

假设:

  • 所有相关的存储过程都是简单的获取存储过程(例如,SELECT [SOMETHING] FROM [SOMEWHERE] INNER JOIN [SOMETHING ELSE] 等....)
  • 所有数据永远不会改变(它确实会不时改变,为了我的场景,假设它不会)
  • 无论出于何种原因,缓存最初都是空的。

有问题的方法:
我检查应用程序缓存中是否存在该对象。如果它存在,我只是返回它。如果该对象不在缓存中,则对数据库进行 sproc 调用以查找此数据。一旦 sproc 返回,此数据将添加到缓存中,然后返回。

在重负载下,我有一些性能问题需要解决。

这是我的场景:

  1. 用户A进入这个方法。
  2. 数据不在缓存中,存储过程被调用。
  3. 用户 B 进入此方法(存储过程仍在运行时)。
  4. 数据不在缓存中,存储过程被调用。
  5. 反复冲洗和重复。

在重负载下,这些可以生成相当多的并发和冗余事件 spid。我试图找出解决这个问题的最佳方法。显然,我可以放入 sp_getAppLock,但请求仍会以 1) 放入 sproc 和 2) 必须触发完全相同的查询而告终。我可以锁定特定于该确切查询的对象,并将其包裹在缓存检查中。但如果我这样做,我可能会为一些大规模的线程争用和死锁打开大门。

我必须假设有人以前处理过这种情况,我希望有一个合适的解决方案。现在我能想到的最好的解决方案是应用程序锁定,但我真的很想知道是否有人有更好的选择。也许是事情的组合,比如 sql 应用程序锁和消息传递(传统或非传统),在锁成功后,任何刚刚释放的东西都会尝试拉下结果集(从哪里?),而不是重新执行整个存储过程的其余部分。

编辑:
所以按照这个....如果我锁定或“等待”缓存或sproc调用,在重负载下,如果一个元素没有被缓存并且生成要被缓存的对象的方法(或sproc)可能最终可能需要比预期更长的时间。当它正在旋转时,线程将不得不等待。通过等待,唯一的方法(至少我知道)是锁定或旋转。

那么是不是可能会导致线程池耗尽或锁定所有可用请求并强制将请求排队?这是我的恐惧,也是促使我考虑将该层从应用程序移到数据库中的原因。上次我们尝试锁定缓存时,我们的 web 框上出现了严重的 CPU 峰值,因为线程处于锁定状态的时间太长了。虽然我相信当时我们没有使用 Monitor.Enter/Monitor.Exit(或只是 lock(){})。无论哪种方式,有没有人有这方面的任何细节或经验?我知道出于这个原因锁定长时间运行的进程通常是不好的形式。如果我可以避免阻止用户请求掉入请求队列,我会遭受将重复内容加载到缓存中的痛苦,因为我的线程都用完了,或者所有事件的请求都被锁定了。

或者,也许现在已经晚了,我想不通了。我以几乎是辉煌的“啊哈”时刻开始了我的一天。但现在我只是不断地猜测自己。

最佳答案

您的缓存很可能受锁保护,因此您已经在序列化线程。

您建议的解决方案是最好的:锁定查询。一旦缓存被填充,性能差异将可以忽略不计,您将避免多次(和昂贵的)数据库查询。

关于c# - 调用同一个 sql server 2005 存储过程的多个 asp.net 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8671765/

相关文章:

c# - 使用 JsonProperty 将 JSON 绑定(bind)到模型属性

C#、Visual Studio,如何获取错误和警告的 ID?

c# - 如何以编程方式分析以了解两个表之间存在多对多关系?

javascript - 菜单中的 GridView

sql - 从存储过程中调用存储过程的性能问题

sql - 删除 SQL 会锁定表以防止新数据插入 SQL Server 2005 吗?

c# - 使用 Skype API 从调用 ID 获取聊天 ID

asp.net - 作为动态变量的数学运算符

asp.net - Godaddy 服务器无法使用电子邮件

sql - 在这种情况下我应该如何工作。我应该使用触发器还是保留用户来管理