为XA Reource调用DbConnection.close()会发生什么?它是否会返回到连接池,还是由事务管理器保存,直到全局事务完成?
答案 0 :(得分:1)
我一直在开头寻找答案的地方,但没有人可以给我一个确认。
大多数情况下,实际的事务管理器行为取决于供应商。但您也可以参考JTA 1.1规范来了解标准行为。
- 假设客户端使用TX_REQUIRED事务属性调用EJB bean,并且客户端未与全局关联 在事务中,EJB容器通过调用启动全局事务 TransactionManager.begin方法。
- 事务开始后,容器调用bean方法。作为业务逻辑的一部分,bean请求a 使用资源提供的API的基于连接的资源 感兴趣的适配器。
- 应用程序服务器通过某些ResourceFactory.getTransactionalResource方法从资源适配器获取资源。
- 资源适配器创建TransactionalResource对象以及关联的XAResource和Connection对象。
- 应用程序服务器调用getXAResource方法。
- 应用程序服务器将资源登记到事务管理器。
- 事务管理器调用XAResource.start将当前事务与资源相关联。
- 应用程序服务器调用getConnection方法。
- 应用程序服务器返回对应用程序的Connection对象引用。
- 应用程序对连接执行一个或多个操作。
- 应用程序关闭连接。
- 当资源适配器通知有关连接关闭时,应用程序服务器会删除资源。
- 事务管理器调用XAResource.end以取消事务与XAResource的关联。
- 应用程序服务器要求事务管理器提交事务。
- 事务管理器调用XAResource.prepare来通知资源管理器为提交准备事务工作。
- 事务管理器调用XAResource.commit来提交事务。
醇>
所以为了回答你的问题,当你调用close()
时,连接将被摘除,它仍然被事务管理器保留,所以你可以在提交之前安全地调用close()
- 返回到池的连接(如果你担心连接泄漏),虽然有很多事务管理器将帮助自动关闭连接而无需手动关闭它(参考Hibernate框架和事务管理器)。