我刚刚发现为什么所有的ASP.Net网站都很慢,我正在努力想办法解决这个问题

我刚刚发现ASP.NETWeb应用程序中的每个请求在请求开始时都会获得一个会话锁,然后在请求结束时释放它

如果你不明白这一点,就像一开始对我一样,这基本上意味着:

  • 只要ASP.Net网页需要很长时间才能加载(可能是由于数据库调用缓慢或其他原因),并且用户因为厌倦了等待而决定导航到其他页面,他们就不能!ASP.Net会话锁强制新页面请求等待,直到原始请求完成缓慢得令人痛苦的加载。啊

  • 每当UpdatePanel加载缓慢,并且用户决定在UpdatePanel完成更新之前导航到其他页面时。。。他们不能!ASP.net会话锁强制新页面请求等待,直到原始请求完成缓慢得令人痛苦的加载。两个啊

那么有什么选择呢?到目前为止,我提出了:

  • 实现ASP.Net支持的自定义SessionStateDataStore。我还没有发现太多可以复制的东西,而且这似乎有点高风险,而且很容易搞砸
  • 跟踪所有正在进行的请求,如果请求来自同一用户,则取消原始请求。看起来有点极端,但它会起作用(我想)
  • 不要使用会话!当我需要用户的某种状态时,我可以使用缓存,以及验证用户名上的关键项,或者类似的东西。似乎又有点极端了

我真不敢相信ASP.NETMicrosoft团队会在4.0版的框架中留下如此巨大的性能瓶颈!我错过了什么明显的东西吗?在会话中使用ThreadSafe集合有多困难

如果您的页面没有修改任何会话变量,您可以选择退出大部分锁定

<%@Page EnableSessionState=“ReadOnly”%>

如果您的页面没有读取任何会话变量,您可以为该页面选择完全退出该锁

<%@Page EnableSessionState=“False”%>

如果没有任何页面使用会话变量,只需在web.config中关闭会话状态

<会话状态模式=“关闭”/>

我很好奇,如果不使用锁,你认为“线程安全集合”将如何成为线程安全集合

编辑:我应该解释一下我所说的“选择退出大部分锁”的意思。对于给定会话,可以同时处理任意数量的只读会话或无会话页面,而不会相互阻塞。但是,在所有只读请求完成之前,读写会话页无法开始处理,并且在运行时,它必须以独占方式访问该用户的会话,以保持一致性。锁定单个值是行不通的,因为如果一个页面作为一个组更改一组相关值会怎么样?如何确保同时运行的其他页面能够获得用户会话变量的一致视图

如果可能的话,我建议您在设置会话变量后尽量减少对它们的修改。这将允许您将大部分页面设置为只读会话页面,从而增加来自同一用户的多个同时请求不会相互阻塞的可能性

发表评论