【问题标题】:Session state blocking async ajax call from processed concurrently会话状态阻止并发处理的异步 ajax 调用
【发布时间】:2012-06-29 12:22:01
【问题描述】:

我正在尝试在 document.ready 上一次对我的 .NET 页面方法进行 6 次异步 jQuery ajax 调用,以从数据库中请求不同的数据集,然后以图表的形式呈现给用户。

问题是当一个图表需要很长时间生成时,它会锁定接下来5个图表的生成,例如,当每个图表需要1分钟生成时,用户将等待大约6分钟,而不是1 - 2 分钟,我认为在使用异步 ajax 调用和页面方法时会并行处理。

在这个论坛看了很多有用的帖子后,我发现这是因为我必须在页面方法中读取和写入会话对象,而asp.net会锁定整个请求,从而使它们运行顺序。

我看到有人建议在@Page 标记中将会话状态设置为只读,但这不会解决我的问题,因为我还需要写入会话。我考虑过从 inProc 会话转移到 sql 数据库会话,但是我的会话对象不可序列化并且在整个项目中使用。我也不能改为使用缓存,因为会话包含用户特定的详细信息。

谁能帮我指出正确的方向?我花了几天的时间来调查这个页面效率低下,但仍然没有找到一个好的方法。

提前致谢

【问题讨论】:

  • 另一件事是,这是我第一次在这个论坛上发帖,所以希望我的问题是有意义的 :) 最良好的祝愿,再次感谢
  • 恕我直言,对 Session 的高度依赖表明 Web 应用程序设计不佳。或许你可以解释一下为什么 Session 会参与图表的生成?

标签: asp.net session jquery pagemethods


【解决方案1】:

根据我的个人经验,切换到 SQL 会话不会解决这个问题,因为所有并发线程都会在 SQL 中阻塞,因为第一个线程将在数据库中的一个或多个行上持有排他锁。

我很好奇为什么您的会话对象不可序列化。我能想到的唯一解决方案是使用数据库表来存储您在会话中保持的用户特定数据,然后只要您需要更新用户数据,就只持有数据库锁。

您可以使用 ASP.NET 会话 ID 或其他唯一的 cookie 值作为数据库键。

【讨论】:

  • 感谢您的快速回复。如果可能,我正在寻找一种允许我手动锁定或解锁会话对象的方法。由于我目前正在进行的项目非常庞大,我想尽可能地减少影响。
  • 因此,如果可能,切换到 SQL 会话将是我最后的选择。我当前的会话对象不可序列化,因为它包含循环引用,但如果我没有意义,请纠正我,因为我还没有真正深入研究将项目转换为 SQL 会话。 :)
  • 是的,我明白了。希望其他人会对如何做到这一点提出建议。另一个想法是考虑使用缓存块并将用户唯一 ID 添加到缓存键。
  • 再一次,SQL 会话也无济于事。我已经看到来自单个用户的多个请求在 SQL Server 会话数据库中排队。微软的回应是代码按设计运行。
  • 我粗略地尝试了缓存,它确实解决了整个请求锁定的问题,但我读到缓存可能会自行过期,对吗?
【解决方案2】:

问题可能根本不在服务器端。

浏览器对它们将发出多少并发 HTTP 请求有一个内置限制 - 这是 HTTP/1.1 规范的一部分,该规范建议限制为 2。

在 IE7 中限制为 2。在 IE8 中为 6。但是当页面加载时,由于对 CSS、JS、图像等的并发请求,您很容易达到 6。

关于这些限制的一个很好的信息来源是BrowserScope(请参阅每个主机名列的连接数)。

将这 6 个请求合并为 1 个请求怎么样?这也会加载得更快一些。

【讨论】:

  • 您好,感谢您的回复。我实际上在我的 web.config 中添加了以下代码,以将并发进程数增加到 20
  • 从 fiddler 和 chrome 我检查了请求是否同时发送并且同时启动
  • 好的,如果请求在 Fiddler 中是并发的,那么您正在处理服务器端并发。只是觉得值得一提。
  • 是的,谢谢saille,这确实是一个非常关键的点,我最初遇到了2个并发问题,并一直在寻找为什么只有2个请求首先出现,所以竖起大拇指:)
猜你喜欢
  • 2017-06-10
  • 2020-05-30
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
  • 2015-01-19
  • 2011-10-09
  • 2014-06-20
  • 2011-07-11
相关资源
最近更新 更多