关闭HTTP会话以在Java/Tomcat中写入
在处理ASP.NET应用程序时,我发现在会话缓存中放置某些内容,或者实际上,在会话缓存中访问变量,会导致Ajax查询停止异步。我了解到这是因为会话基本上是阻塞的——如果我同时从浏览器发出两个Ajax请求,并且第一个请求需要一点时间才能返回,会话将锁定在第一个请求中,直到该请求完成,此时我的第二个Ajax请求开始工作 在PHP中,我发现有一个选项可以关闭会话进行写入(和/或以只读方式打开它),这样会话变量访问就不会阻塞,并且保持异步关闭HTTP会话以在Java/Tomcat中写入,java,ajax,session,tomcat,concurrency,Java,Ajax,Session,Tomcat,Concurrency,在处理ASP.NET应用程序时,我发现在会话缓存中放置某些内容,或者实际上,在会话缓存中访问变量,会导致Ajax查询停止异步。我了解到这是因为会话基本上是阻塞的——如果我同时从浏览器发出两个Ajax请求,并且第一个请求需要一点时间才能返回,会话将锁定在第一个请求中,直到该请求完成,此时我的第二个Ajax请求开始工作 在PHP中,我发现有一个选项可以关闭会话进行写入(和/或以只读方式打开它),这样会话变量访问就不会阻塞,并且保持异步 我正在构建一个将是Java的应用程序,可能运行在Tomcat上(
我正在构建一个将是Java的应用程序,可能运行在Tomcat上(尽管如果需要,我可以更改为其他容器),但我无法确定Java是否存在相同的问题(会话变量读取块)或具有相同的补救措施(提前关闭,只读模式)。以前有人遇到过这个问题吗?阻塞似乎是由于线程同步访问
HttpSession
而发生的,如中所述
所以,必须是第二个请求只有在第一个请求使用HttpSession
时才会被阻止(或者如果您有一些共享锁被第一个请求长时间持有,但这与Tomcat无关)
由于Servlets规范要求这种同步,所以不应该试图违反它。相反,让你的应用程序尽可能地减少读取或写入HttpSession
所需的时间
此外,正如我在上面所写的,如果您有额外的锁,使多个请求按顺序执行,则可能会发生阻塞。当您向Tomcat发送第二个请求时,尝试对Tomcat进行几个线程转储,并查看是否存在第二个请求等待的此类锁。在Tomcat中,
HttpSession
在org.apache.catalina.session.StandardSession
(源代码)中实现
如果您查看源代码,您将看到对HttpSession.getAttribute(String)
和HttpSession.setAttribute(String,Object)
的调用几乎被引导到ConcurrentHashMap
而无需任何额外同步
这意味着这些调用派生了ConcurrentHashMap
的契约。引用其:
- 检索操作不需要锁定,也不支持以阻止所有访问的方式锁定整个表。检索操作(包括get)通常不会阻塞,因此可能与更新操作(包括put和remove)重叠
- 该表是内部分区的,以尝试允许指定数量的并发更新,而不会产生争用。由于哈希表中的位置基本上是随机的,因此实际的并发性会有所不同
someTimeExpensiveMethod()
将在调用put()
之前进行评估,如果方法是同步的,someTimeExpensiveMethod()
将在进入同步块之前运行。这是价值观,不是名字。是的,我的错。那么,OP可能使用1.5版本之前的JDK,它没有ConcurrentHashMap
?:)@维克多索罗金:我以为OP正在考虑使用Java/Tomcat,并询问它的行为是否与PHP/ASP.NET类似。还是你说的OP?哎呀,又是我的错。我认为OP在Java上有阻塞问题,而不是ASP。