6

根据Hibernate docs,在 JTA 环境中,默认的连接释放模式是 after_statement,这意味着在每条语句之后都会释放 hibernate 逻辑连接。

当逻辑连接被释放时,Connection close() 方法被调用,当前资源被从事务管理器中除名。

根据 RedHat事务开发指南

"delistResource 方法用于将指定资源与目标对象中的事务上下文分离。应用服务器调用该方法时带​​有两个参数:

An XAResources object, which represents the resource.
A flag to indicate whether the operation is due to the transaction being suspended (TMSUSPEND), a portion of the work has failed (TMFAIL), or a normal resource release by the application (TMSUCCESS)."

由于 Bitronix 使用 TMSUCCESS:

 currentTransaction.delistResource(xaResourceHolderState.getXAResource(), XAResource.TMSUCCESS);

这意味着连接与当前事务分支解除关联,有时您最终可能会为同一个 Resource Adapter 争取 2 个不同的连接

我认为在事务发生时保持连接是一个更好的选择,因为我们通常在每个事务中执行多个语句。所以 after_transaction 释放模式听起来更有吸引力。

after_transaction 发布模式是否更适合 Bitronix?有人在生产环境中体验过吗?

4

1 回答 1

7

您不应该看到 after_statement 和 after_transaction 之间有任何区别,至少对于 BTM。理论上,after_statement 是“更正确的”,因为连接和事务在 XA 上下文中应该是完全独立的,并且连接应该能够同时服务于多个事务。在实践中,连接和事务几乎从不独立,因为几乎没有资源支持这一点。

BTM 连接池实现了一个相对复杂的 FSM,允许它在连接上保持事务隔离,同时尽可能重用连接。

在单个事务的上下文中,重复从池中获取连接然后关闭它应该只消耗池中的单个连接:池应该始终将同一个连接放在一边并重新使用。我能想到这会导致从池中消耗两个连接的唯一原因是,如果您在第一个连接尚未关闭时再次获取连接。任何其他原因都可能被认为是 BTM 连接池中的错误。

于 2014-05-22T07:50:23.393 回答