代码之家  ›  专栏  ›  技术社区  ›  dcharles

在每个会话都可能有并发请求的情况下,为什么不使用Tomcat的PersistentValve?

  •  6
  • dcharles  · 技术社区  · 5 年前

    PersistentValve 存在使用限制:

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

    为什么会有这种限制? 仔细阅读代码,我发现了三个原因:

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

    还有其他原因吗?

    1 回复  |  直到 5 年前
        1
  •  9
  •   Selaron Egesa Michael    5 年前

    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说:

    ... 我唯一看到其他问题的地方是:

    它错误地从PersistentManager获取存储,并 直接使用它,而不是使用manager API。对我来说这很糟糕 因为管理者不能成为管理者,这是另一种逻辑 正在直接访问存储,并且永远不会发生…除非是 仅用于测试用例等。

    所以在这里它被认为是 Managers '使用会话的唯一任务 Store 用于存储、加载和删除会话。但是 PersistentValve

    PersistentManager ,只添加了有问题的评论 PersistentValve.java 另外,删除了一个未使用的变量:

    - StandardHost host = (StandardHost) getContainer();
    

    虽然我不知道这个行删除或过去存在的目的,但我认为在代码审查过程中识别出的提交器标记托马斯,并且在任何时间点,每个会话只有最多一个请求激活时,持久化阀只能保证CONSTESTION会话写入。否则,可能会发生写操作丢失。

    我不会判断这有多实际,但只要想想每个网页印象(主HTML、CSS、JS、图像)中并行加载的大量资源就可以了。