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

时间:2013-06-12 19:14:47

标签: java tomcat jdbc connection-pooling

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

例如:30个客户拥有带物品的购物车,并且他们同时保存订单,因此启动了交易,并触发了重新部署 怎么了?是否正确保存了所有项目?或在重新部署时,所有活动交易都被丢弃?或Tomcat等待redeploy命令直到所有事务都被提交?

我正在使用Tomcat JDBC Pool

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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