共计 780 个字符,预计需要花费 2 分钟才能阅读完成。
本文为 [原创] 文章,转载请标明出处。原文链接:https://weyunx.com/2019/01/22… 原文出自微云的技术博客
最近在维护一个老项目,发现了一个问题。我们新增了一个耗时较久的复杂查询的功能,页面采用了 ajax 异步请求数据,但是请求未返回之前,点击页面其他功能都只能打开空白页,必须等待之前的数据返回后才能开始加载,整个过程是串行等待,调试过程中发现服务器仅分配了一个线程给该用户。故查看了一下原始代码,发现 web.xml 中配置了如下参数:
<init-param>
<param-name>synchronizeOnSession</param-name>
<param-value>true</param-value>
</init-param>
看了一下 spring mvc 的说明文档,仅找到一处说明:
Enforces the presence of a session. As a consequence, such an argument is never null. Note that session access is not thread-safe. Consider setting the RequestMappingHandlerAdapter instance’s synchronizeOnSession flag to true if multiple requests are allowed to concurrently access a session.
因为 session 是非线程安全的,如果需要保证用户能够在多次请求中正确的访问同一个 session,就要将 synchronizeOnSession 设置为 TRUE。
所以此处把 synchronizeOnSession 改为 false 后,问题随之解决,调试中可以看到服务器为用户分配了多个线程。
同时也可以参考这个例子
参考资料
docs.spring.io