在JTA中关闭jdbc连接

时间:2015-09-19 04:27:24

标签: java jdbc jta xa

为XA Reource调用DbConnection.close()会发生什么?它是否会返回到连接池,还是由事务管理器保存,直到全局事务完成?

1 个答案:

答案 0 :(得分:1)

我一直在开头寻找答案的地方,但没有人可以给我一个确认。

大多数情况下,实际的事务管理器行为取决于供应商。但您也可以参考JTA 1.1规范来了解标准行为。

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

enter image description here

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