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

2024-06-22

在顶部的班级评论中PersistentValve https://github.com/apache/tomcat/blob/TOMCAT_9_0_14/java/org/apache/catalina/valves/PersistentValve.java有一个使用限制:

/**
...
 * <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() https://github.com/apache/tomcat/blob/TOMCAT_9_0_14/java/org/apache/catalina/valves/PersistentValve.java将管理器设置为空共享会话对象 https://github.com/apache/tomcat/blob/TOMCAT_9_0_14/java/org/apache/catalina/session/StandardSession.java#L955和另一个请求取消引用管理器时尝试将会话保存到存储中 https://github.com/apache/tomcat/blob/TOMCAT_9_0_14/java/org/apache/catalina/session/StandardSession.java#L1641.
  3. 性能低效(例如,冗余的持久性存储访问等)。

还有其他原因吗?


在进行 SVN-Blame 时,我发现此评论是在 2008 年 5 月 1 日添加到 svn 修订版 652662 中的修复错误 43343 https://bz.apache.org/bugzilla/show_bug.cgi?id=43343使用提交评论:.

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

...我看到其他问题的唯一地方是: java/org/apache/catalina/valves/PersistentValve.java

它错误地从 PersistentManager 获取存储并且 直接使用它而不是使用管理器 API。对我来说这很糟糕 因为经理不能成为经理,而其他逻辑 正在直接访问商店,并且永远不应该发生......除非它是 仅在测试用例等中使用。

所以这里被认为是Managers' 使用会话的唯一任务Store用于存储、加载和删除会话。但是PersistentValve做同样的事情,可能很容易干扰经理的工作。

在错误修复提交期间除了修改PersistentManager,仅将相关评论添加到PersistentValve.java再加上一个未使用的变量被删除:

- StandardHost host = (StandardHost) getContainer();

虽然我不知道删除这一行的目的或过去存在的情况,但我认为提交者 Mark Thomas 在代码审查和补丁过程中认识到,当任何时候每个会话最多只有一个活动请求时,PersistentValve 只能保证一致的会话写入及时。否则可能会发生丢失写入的情况。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在每个会话可能有并发请求的情况下不应该使用 Tomcat 的 PersistentValve? 的相关文章

  • Worker verticles 不并行处理请求

    我正在尝试扩展一个应用程序 该应用程序对外部应用程序进行阻塞调用以获取一些数据 请求和响应顺序并不重要 因为 它是一个阻塞调用 如 vertx 文档中所述 我正在使用工作器 verticle 工作器池设置为 5 并且我已经部署了 5 个工作
  • 有没有办法获取 JList 中的所有元素?

    我想知道是否有一种方法可以检索已添加到 JList 的所有元素的列表 例如 我希望 JList 从自定义单元格渲染器返回字符串或 JLabels 的数组或列表 您可以使用getModel http docs oracle com javas
  • 扩展 CrudRepository (Spring) 时是否需要 @Repository 注解?

    public interface CarRepository extends CrudRepository
  • Hibernate统计打印HQL:null

    我是使用休眠的新手 我打开了统计信息 与普通的 HQL 查询一起 我得到了许多这样的统计信息 INFO Statistics HQL null time 1724ms rows blah 有人可以以任何方式帮助我为什么null查询大约需要
  • 限制执行第三方软件的线程的权限

    我正在开发一个基于 Eclipse 的应用程序 能够执行第三方组件 不是 eclipse plugin 每个组件都有一个列出权限 以及相应动机 的自定义描述符 这样最终用户可以决定是否执行它 组件在单独的线程中执行 如何根据描述符限制这些线
  • 如何选择主题与队列

    当我们设计应用程序时如何选择Topic Queue类型实现 我知道 a 如果有多个消费者使用该消息 则使用 Topicb 如果只有一个消费者则使用Queue 请提供更多需要考虑的点 比如并发 消息持久化 负载均衡等等 Thanks Rw 如
  • 使用核心 Node.js 进行会话管理,无需 Express.js

    如何在核心 Node js 非express js 项目中处理 创建用于服务器端会话管理的中间件 我可以找到基于 Express 的项目的模块 但不能找到核心 Node js 的模块 请向我推荐任何用于非express js 项目的模块或中
  • uniVocity 不会将第一列解析为 beans

    我试图在 uniVocity parsers 的帮助下从 GTFS zip 读取 CSV 文件 但遇到了一个我无法解决的问题 由于某种原因 某些 CSV 文件的第一列似乎无法正确解析 例如 在 stops txt 文件中 如下所示 stop
  • 如何清除客户端.Net SSL会话缓存

    我正在编写一个小测试工具 它使用 HttpWebRequest 来负载测试服务器 我想要 每次我尝试调用 HttpWebRequest GetResponse 时 它都会建立一个新的 SSL 会话 而不是使用缓存中的会话 注意 我提供客户端
  • 获取 Spring Boot 中当前活动数据源的引用

    我想通过实现数据库数据初始化DataSourceInitializer 我将这些方法放在我的 Spring Boot 主方法下面 但似乎它根本没有被执行 我尝试故意删除字符只是为了触发一个错误来确认执行 什么也没有发生 Configurat
  • Apache HTTPClient SSLPeerUnverifiedException

    使用 Apache HttpClient 4 2 1 使用从基于表单的登录示例复制的代码 http hc apache org httpcomponents client ga examples html http hc apache or
  • 识别包含本机方法实现的库文件/源

    如何识别包含本机方法实现的库文件 Ex public native String intern 我在哪里可以找到实施 source code of String intern 方法 找到了答案String intern 与快速谷歌搜索 ht
  • Java Reflection:为什么这么慢?

    我一直避免使用 Java 反射 因为它速度缓慢 我在当前项目的设计中达到了一个点 能够使用它将使我的代码更具可读性和优雅性 所以我决定尝试一下 我只是对这种差异感到惊讶 我注意到有时运行时间几乎延长了 100 倍 即使在这个简单的例子中 它
  • NoSuchMethodError:org.springframework.data.repository.config.RepositoryConfigurationSource.getAttribute

    我正在尝试在 spring boot 应用程序中使用 spring data redis 来使用 redis 我正在创造JedisConnectionFactory如下 RedisStandaloneConfiguration config
  • StringBuilder - 重置或创建新的

    我有一个条件 StringBuilder 不断存储与大型平面文件 数百 MB 中的模式匹配的行 但是 在达到条件后 我将 StringBuilder 变量的内容写入文本文件 现在我想知道是否应该通过重置对象来使用相同的变量 gt strin
  • Java - 动态创建子类

    我想以编程方式创建一个子类 我想我的选择很少 Javassist CGLib BCEL 或 ASM 用例是一个应用程序的内部是面向类的 而扩展是基于类的 因此 我不能将单个类作为由外部化脚本驱动的多个扩展的基础 现在 我该怎么做呢 我找到了
  • Java中有没有办法随机获取HashMap的值?

    Java中有没有办法随机获取HashMap的值 这有效 Random generator new Random Object values myHashMap values toArray Object randomValue values
  • 如何处理JFreeChart中的SpiderWebPlot?

    发现 JFreeChart 我在使用时遇到了问题蜘蛛网情节 http www jfree org jfreechart api javadoc org jfree chart plot SpiderWebPlot html 这就是我今天所拥
  • Java中ThreadFactory的使用

    有人可以简要解释一下如何以及何时使用 ThreadFactory 吗 使用和不使用 ThreadFactory 的示例可能确实有助于理解差异 Thanks 这是一种可能的用法 假设您有一个ExecutorService它执行你的Runnab
  • JFrame.repaint() 和 JPanel.repaint() 之间的区别

    谁能解释一下两者之间的区别JPanel repaint 方法和JFrame repaint 方法 我想两者都调用paintComponent JPanel 中的方法 请澄清 谢谢 Calling repaint 在任何组件上都会向重绘管理器

随机推荐

  • 使用 Thread.sleep 线程休眠时的 CPU 消耗

    我有一个服务器程序 它会轮询数据库以获取新请求 我希望以 1 分钟的间隔进行轮询 因此 我在程序 while 循环中设置了 Thread sleep 问题是 只要该程序应该 睡眠 CPU 消耗就会急剧上升 即大约 25 30 矛盾的是 当程
  • git diff 文件与上次更改的比较

    是否可以让 git 生成当前存在的特定文件与上次更改它之前存在的文件之间的差异 也就是说 如果我们知道 git log oneline myfile 123abc Fix some stuff 456def Frobble the foos
  • 无法在 Linux 上运行 Pyinstaller 可执行文件

    我正在尝试pyinstaller首次 我创建了一个名为hello py只需一行代码 print hello 我使用以下命令来制作二进制文件 pyinstaller hello py 该过程成功完成 并在以下位置创建了一个二进制文件dist
  • 顶点着色器中的透视划分?

    当在顶点着色器中使用透视矩阵时 我应该编写代码来除以 w 还是在稍后阶段自动完成 我的问题的原因是我看到很多顶点着色器使用 gl Position matrix pos 如果后面有一个阶段将向量除以它的 w 分量 这就有意义了 然而 直到我
  • java.sql.SQLSyntaxErrorException: ORA-00955: 名称已被现有对象使用

    我正在使用 Oracle 11g R2 我想创建一些用户表 当我运行查询时 它创建了几个表并生成java sql SQLSyntaxErrorException ORA 00955 名称已被现有对象使用例外 Connection con p
  • 有人有 Sphinx 语音识别的经验吗?

    有没有人用过Sphinx http cmusphinx sourceforge net html cmusphinx php语音识别堆栈来构建 IVR 应用程序 我正在寻找开源替代方案 以替代 MSFT 和其他公司提供的昂贵且有些限制的选择
  • 用换行对字符进行位移位? C++

    我有一个二进制文件 它将作为字符读入 每个字符都被其他人向左移动了未知次数 假设有换行 我希望能够读取每个字符 然后将移位向右换行 我想必须手动计算出移位的次数 因为我还没有找到其他方法 所以 我当前的想法是读入一个字符 用 temp 创建
  • Android获取地球坐标系上的加速度计

    我想在 Android 上获取加速度计并将它们放在地球坐标系上 就像这个主题一样从设备坐标系到绝对坐标系的加速度 https stackoverflow com questions 11578636 acceleration from de
  • React-navigation 5 一次导航多条路线

    有没有比以下更好的多条路线导航方法 NavigatorService navigate Screen1 params NavigatorService navigate Screen2 params Where Screen1 and Sc
  • Firebase commitChangesWithCompletion on ProfileChangeRequest 未触发

    我从 Firebase 参考中获取确切的代码 将其放入方法中 然后完成处理程序 也不是函数 执行 有谁知道为什么吗 let user FIRAuth auth currentUser if let user user let changeR
  • 如何在scala中运行时查找类参数数据类型

    import scala reflect runtime universe import scala reflect runtime universe def getType T TypeTag obj T typeOf T case cl
  • 为什么 main() 函数没有在 if '__main__' 中定义?

    你经常可以看到这个 变体a def main do something do sth else if name main main 我现在想知道为什么not这个 变体b if name main do something do sth el
  • 调试多个网站时 Visual Studio 2010 iis Express 冻结

    我有一个 Visual Studio 2010 解决方案 可以在其中同时调试两个网站 调试开始后不久 出现错误 Visual Studio 将冻结 我收到托盘图标和消息 Visual studio 正忙 Microsoft Visual S
  • TextInputLayout 错误文本填充

    我在用文本输入布局 with 应用程序兼容性编辑文本具有基于自定义 xml 形状的背景应用程序兼容性编辑文本 每当我设置一些错误时 错误行就会从布局的开头开始 有什么方法可以为该错误行提供填充吗 您可以使用以下方法引用错误 TextView
  • BBC Basic:无法在屏幕上绘制矩形

    我最近拿到了一台 BBC Micro B 型 并将其作为一个业余爱好项目 我在使用图形命令时遇到了一些问题 想知道是否有人可以指出我正确的方向 我编写了以下测试程序来在屏幕上绘制一个矩形 10 CLS 20 MODE 5 30 MOVE 0
  • 什么是 NTLM/Authenticate/Negotiate Web 身份验证

    我了解基本身份验证和摘要身份验证 但我进行了很多搜索 并且在 NTLM 身份验证和协商方面遇到了困难 我认为 如果我错了 请纠正我 NTLM 和身份验证是同一协议的两个术语 协商首先尝试 NTLM 然后回退到消化 然后回退到基本连接 那是对
  • 使用默认数据库名称在 docker 中启动 InfluxDB 容器

    我正在运行以下命令来启动InfluxDB容器 这应该创建一个名为的新数据库defaultdb docker run p 8086 8086 e INFLUXDB DB defaultdb e INFLUXDB ADMIN ENABLED t
  • 使用 C# 解析 XML 文件?

    我对 XML 和 C 都很陌生 我试图找到一种方法来有效地解析给定的 xml 文件以检索相关的数值 基于 proj title 值 heat run 或任何其他可能的值 例如 计算特定测试运行的持续时间 proj end val proj
  • 将 Woocommerce 商店变成地理定位国家/地区的目录?

    我正在尝试将我的 woocommerce 商店转变为目录模式 取决于国家 地区 我只想在美国显示产品的价格并添加到购物车功能 我试图通过使用一个名为 的插件来实现这一点GeoIP检测 https wordpress org plugins
  • 为什么在每个会话可能有并发请求的情况下不应该使用 Tomcat 的 PersistentValve?

    在顶部的班级评论中PersistentValve https github com apache tomcat blob TOMCAT 9 0 14 java org apache catalina valves PersistentVal