1

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

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

我正在使用 Tomcat JDBC 池

4

1 回答 1

3

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

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

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

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

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

简而言之,您的应用程序将在新上下文开始之前正常关闭,因此我希望交易能够完成或制定InterruptedException您的try...finally块应该启动的点

于 2013-06-12T19:41:58.300 回答