2015-09-19 4 views
0

Что произойдет, когда вызывается DbConnection.close() для XA Reource? Будет ли он возвращен в пул соединений или он будет удерживаться менеджером транзакций до завершения глобальной транзакции?закрытие соединений jdbc в JTA

ответ

1

Я расколол голову и искал так много места для ответа, но никто не может дать мне подтверждение.

В большинстве случаев фактическое поведение менеджера транзакций зависит от поставщика. Но вы также можете обратиться к спецификации JTA 1.1 для стандартного поведения.

  1. Предполагая, что клиент вызывает в EJB компонент с атрибутом транзакции TX_REQUIRED и клиент не связан с глобальной транзакции, контейнер EJB начинает глобальную транзакцию путем вызова причем способ TransactionManager.begin.
  2. После того, как транзакция начинается, контейнер вызывает метод 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 для фиксации транзакции.

enter image description here

Итак, чтобы ответить вам вопрос, а вы называете close(), соединение будет делистинг, это как-то по-прежнему является удержание менеджером транзакций, так что вы можете смело назвать close(), прежде чем совершить для предварительного подключения к пулу (если вы беспокоитесь о утечке соединения), хотя многие транзакции Manager помогут автоматически закрыть соединение без необходимости его вручную закрыть (см. Hibernate framework и Transaction Manager).