gpt4 book ai didi

java - tomcat 重新部署时的 JDBC 事务行为

转载 作者:行者123 更新时间:2023-11-28 22:08:53 25 4
gpt4 key购买 nike

当我有许多 Activity 的 JDBC 事务并且重新部署命中 Web 应用程序时会发生什么?我搜索了 Tomcat 文档,但没有找到任何相关内容。

例如:30个客户有一个购物车,里面有商品,他们同时保存了订单,于是开启了一个事务,并触发了一次重新部署会发生什么?是否正确保存了所有项目?或者在重新部署时所有 Activity 事务都被丢弃?还是 Tomcat 等待重新部署命令直到所有事务都已提交?

我正在使用 Tomcat JDBC 池

最佳答案

要记住的关键点是连接池在哪里实例化?

如果您在 Context 级别定义连接池,则连接池会在创​​建上下文时创建,并且应该也随上下文一起销毁。

在 Tomcat 中重新部署应用程序需要关闭当前上下文,然后启动替换上下文。所以在那种情况下,我希望行为将由 defaultAutCommit 的值决定。或每个事务的 autoCommit 的有效值。如果 true 则关闭资源应该提交事务。如果 false 那么,就像任何 InterruptedException 一样,您的异常处理路径应该触发回滚,或者最坏的情况是连接关闭应该回滚事务。

您真正想要检查的是 Tomcat 如何关闭应用程序。我没有详细查看实际代码,但我的理解是,首先它停止向“旧上下文”发送请求。然后,一旦所有挂起的响应都已完成,就会调用 ServletContextListeners 通知关闭,一旦它们及其 Filter 和 Servlet 对应项完成,上下文就会有效关闭,并且可以清理资源。使事情复杂化的是,IIRC 是 Tomcat 不会永远等待响应完成,并且可能会开始中断处理程序进程,或者只是简单地切换到新上下文而不等待旧上下文或完成拆除。

我不记得哪个容器(jetty/tomcat)支持启动新上下文,然后仅在新上下文准备好进行零停机切换时才切换请求处理......关键问题是你需要一个持久 session 存储和可以在集群上安全运行的应用程序,以便能够使用这种部署模式。

简而言之,您的应用程序将在新上下文开始之前正常关闭,因此我希望事务完成或生成 InterruptedException,此时您的try...finally block 应该启动

关于java - tomcat 重新部署时的 JDBC 事务行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17073465/

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