【发布时间】:2015-09-19 04:27:23
【问题描述】:
当为 XA 资源调用 DbConnection.close() 时会发生什么?是返回连接池还是由事务管理器持有直到全局事务完成?
【问题讨论】:
当为 XA 资源调用 DbConnection.close() 时会发生什么?是返回连接池还是由事务管理器持有直到全局事务完成?
【问题讨论】:
我一直在苦苦寻找答案,但没有一个可以给我确认。
大多数时候,实际的事务管理器行为取决于供应商。但是您也可以参考 JTA 1.1 Specification 了解标准行为。
- 假设客户端调用具有 TX_REQUIRED 事务属性的 EJB bean,并且客户端未与全局关联 事务,EJB 容器通过调用启动全局事务 TransactionManager.begin 方法。
- 事务启动后,容器调用bean方法。作为业务逻辑的一部分,bean 请求一个 使用资源提供的 API 的基于连接的资源 感兴趣的适配器。
- 应用服务器通过某种 ResourceFactory.getTransactionalResource 方法从资源适配器获取资源。
- 资源适配器创建 TransactionalResource 对象以及关联的 XAResource 和 Connection 对象。
- 应用服务器调用 getXAResource 方法。
- 应用程序服务器将资源登记到事务管理器。
- 事务管理器调用 XAResource.start 以将当前事务与资源相关联。
- 应用服务器调用 getConnection 方法。
- 应用程序服务器将 Connection 对象引用返回给应用程序。
- 应用程序对连接执行一项或多项操作。
- 应用程序关闭连接。
- 当资源适配器通知连接关闭时,应用服务器将资源从列表中删除。
- 事务管理器调用 XAResource.end 以解除事务与 XAResource 的关联。
- 应用服务器要求事务管理器提交事务。
- 事务管理器调用 XAResource.prepare 以通知资源管理器准备事务工作以进行提交。
- 事务管理器调用 XAResource.commit 来提交事务。
所以回答你的问题,当你调用 close() 时,连接将被删除,它仍然被事务管理器持有,所以你可以在提交之前安全地调用 close() 以预先返回连接到池中(如果您担心连接泄漏),虽然有很多事务管理器会帮助自动关闭连接而无需您手动关闭它(请参阅 Hibernate 框架和事务管理器)。
【讨论】: