【问题标题】:closing jdbc connections in JTA在 JTA 中关闭 jdbc 连接
【发布时间】:2015-09-19 04:27:23
【问题描述】:

当为 XA 资源调用 DbConnection.close() 时会发生什么?是返回连接池还是由事务管理器持有直到全局事务完成?

【问题讨论】:

    标签: java jdbc jta xa


    【解决方案1】:

    我一直在苦苦寻找答案,但没有一个可以给我确认。

    大多数时候,实际的事务管理器行为取决于供应商。但是您也可以参考 JTA 1.1 Specification 了解标准行为。

    1. 假设客户端调用具有 TX_REQUIRED 事务属性的 EJB bean,并且客户端未与全局关联 事务,EJB 容器通过调用启动全局事务 TransactionManager.begin 方法。
    2. 事务启动后,容器调用bean方法。作为业务逻辑的一部分,bean 请求一个 使用资源提供的 API 的基于连接的资源 感兴趣的适配器。
    3. 应用服务器通过某种 ResourceFactory.getTransactionalResource 方法从资源适配器获取资源。
    4. 资源适配器创建 TransactionalResource 对象以及关联的 XAResource 和 Connection 对象。
    5. 应用服务器调用 getXAResource 方法。
    6. 应用程序服务器将资源登记到事务管理器。
    7. 事务管理器调用 XAResource.start 以将当前事务与资源相关联。
    8. 应用服务器调用 getConnection 方法。
    9. 应用程序服务器将 Connection 对象引用返回给应用程序。
    10. 应用程序对连接执行一项或多项操作。
    11. 应用程序关闭连接。
    12. 当资源适配器通知连接关闭时,应用服务器将资源从列表中删除。
    13. 事务管理器调用 XAResource.end 以解除事务与 XAResource 的关联。
    14. 应用服务器要求事务管理器提交事务。
    15. 事务管理器调用 XAResource.prepare 以通知资源管理器准备事务工作以进行提交。
    16. 事务管理器调用 XAResource.commit 来提交事务。

    所以回答你的问题,当你调用 close() 时,连接将被删除,它仍然被事务管理器持有,所以你可以在提交之前安全地调用 close() 以预先返回连接到池中(如果您担心连接泄漏),虽然有很多事务管理器会帮助自动关闭连接而无需您手动关闭它(请参阅 Hibernate 框架和事务管理器)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-24
      • 2012-11-03
      • 1970-01-01
      • 2012-08-28
      • 2011-06-23
      • 2020-02-14
      • 2018-09-09
      • 1970-01-01
      相关资源
      最近更新 更多