Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关闭HTTP会话以在Java/Tomcat中写入_Java_Ajax_Session_Tomcat_Concurrency - Fatal编程技术网

关闭HTTP会话以在Java/Tomcat中写入

关闭HTTP会话以在Java/Tomcat中写入,java,ajax,session,tomcat,concurrency,Java,Ajax,Session,Tomcat,Concurrency,在处理ASP.NET应用程序时,我发现在会话缓存中放置某些内容,或者实际上,在会话缓存中访问变量,会导致Ajax查询停止异步。我了解到这是因为会话基本上是阻塞的——如果我同时从浏览器发出两个Ajax请求,并且第一个请求需要一点时间才能返回,会话将锁定在第一个请求中,直到该请求完成,此时我的第二个Ajax请求开始工作 在PHP中,我发现有一个选项可以关闭会话进行写入(和/或以只读方式打开它),这样会话变量访问就不会阻塞,并且保持异步 我正在构建一个将是Java的应用程序,可能运行在Tomcat上(

在处理ASP.NET应用程序时,我发现在会话缓存中放置某些内容,或者实际上,在会话缓存中访问变量,会导致Ajax查询停止异步。我了解到这是因为会话基本上是阻塞的——如果我同时从浏览器发出两个Ajax请求,并且第一个请求需要一点时间才能返回,会话将锁定在第一个请求中,直到该请求完成,此时我的第二个Ajax请求开始工作

在PHP中,我发现有一个选项可以关闭会话进行写入(和/或以只读方式打开它),这样会话变量访问就不会阻塞,并且保持异步


我正在构建一个将是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)重叠
  • 该表是内部分区的,以尝试允许指定数量的并发更新,而不会产生争用。由于哈希表中的位置基本上是随机的,因此实际的并发性会有所不同

因此,本质上,您只需确保不执行类似于session.put(key,someTimeExpensiveMethod())的操作即可@VictorOrokin:这不会是问题,
someTimeExpensiveMethod()
将在调用
put()
之前进行评估,如果方法是同步的,
someTimeExpensiveMethod()
将在进入同步块之前运行。这是价值观,不是名字。是的,我的错。那么,OP可能使用1.5版本之前的JDK,它没有
ConcurrentHashMap
?:)@维克多索罗金:我以为OP正在考虑使用Java/Tomcat,并询问它的行为是否与PHP/ASP.NET类似。还是你说的OP?哎呀,又是我的错。我认为OP在Java上有阻塞问题,而不是ASP。