gpt4 book ai didi

java - 为什么在每个 session 可能有并发请求的情况下不应该使用 Tomcat 的 PersistentValve?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:12:00 25 4
gpt4 key购买 nike

在类评论顶部PersistentValve有一个使用限制:

/**
...
* <b>USAGE CONSTRAINT</b>: To work correctly it assumes only one request exists
* per session at any one time.
...
*/

为什么这里有这个约束?仔细阅读代码,我发现了三个原因:

  1. 在不同 Tomcat 实例上对同一 session 的并发请求可能会受到“最后写入获胜”的影响,因此可能会丢失 session 数据。
  2. 由于 session.recycle(),在同一个 Tomcat 实例上对同一个 session 的并发请求可能会导致 NPE在 the shared session object 中将管理器设置为空和另一个请求取消引用管理器时 attempting to save the session to the store .
  3. 性能低下(例如,冗余持久性存储访问等)。

还有其他原因吗?

最佳答案

做一个 SVN-Blame 我发现这条评论是在 2008 年 5 月 1 日的 svn 修订版 652662 中添加的,而 fixing bug 43343使用提交评论:Fix bug 43343. Correctly handle the case where a request arrives for a session we are in the middle of persisting. .

错误的上下文强烈指出您建议的原因 (1) 它与数据丢失有关。在最初的错误描述中,OP 说:

... The only place I saw other issues was inside of: java/org/apache/catalina/valves/PersistentValve.java

where it incorrectly grabs the store from the PersistentManager and uses it directly instead of using the manager API. To me this is bad in that the manager is not able to be the manager and this other logic is accessing the store directly and should never happen...unless it is used only in test cases etc.

因此这里被认为是 Managers 的唯一任务是使用 session Store 来存储、加载和删除 session 。但是 PersistentValve 也做同样的事情,并且可能很容易干扰管理器的工作。

在修改 PersistentManager 的错误修复提交期间,只有有问题的注释被添加到 PersistentValve.java 并且删除了一个未使用的变量:

- StandardHost host = (StandardHost) getContainer();

虽然我不知道此行删除或过去存在的目的,但我认为提交者 Mark Thomas 在代码审查和补丁期间认识到 PersistentValve 只能在每个 session 最多只有一个 Activity 请求时保证一致的 session 写入在任何时间点。否则可能会发生写入丢失。

我不会判断这有多实用,只是考虑每次网页展示并行加载大量资源(主要 HTML、CSS、JS、图像)。

我仍然不确定这是否会成为使用单个 Tomcat 实例的问题。

关于java - 为什么在每个 session 可能有并发请求的情况下不应该使用 Tomcat 的 PersistentValve?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54351959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com