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

标签 java tomcat jdbc connection-pooling

当我有许多 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/

相关文章:

java - 类的通用类型

java - 与不可变对象(immutable对象)一起使用的类工厂 (java) 方法的调用方法

java - 使图像适合背景

java - Java中使用 ".printf(...)"打印内存中的值

java - JDBC Mysql 错误?

tomcat - Debug模式 : Red messages are confusing me

linux - 部署 JSP 网站

java - 不确定,但我认为 eclipse 不会在 tomcat 服务器上运行我的应用程序

java - 在 Java 中连接到 MySQL 数据库错误

java - PostgreSQL 存储过程不工作