Что произойдет, когда вызывается DbConnection.close() для XA Reource? Будет ли он возвращен в пул соединений или он будет удерживаться менеджером транзакций до завершения глобальной транзакции?закрытие соединений jdbc в JTA
0
A
ответ
1
Я расколол голову и искал так много места для ответа, но никто не может дать мне подтверждение.
В большинстве случаев фактическое поведение менеджера транзакций зависит от поставщика. Но вы также можете обратиться к спецификации JTA 1.1 для стандартного поведения.
- Предполагая, что клиент вызывает в EJB компонент с атрибутом транзакции TX_REQUIRED и клиент не связан с глобальной транзакции, контейнер EJB начинает глобальную транзакцию путем вызова причем способ TransactionManager.begin.
- После того, как транзакция начинается, контейнер вызывает метод bean. В рамках бизнес-логики бонусы запрашивают ресурс на основе подключения, используя API, предоставленный ресурсом .
- Сервер приложений получает ресурс от адаптера ресурсов через некоторый метод ResourceFactory.getTransactionalResource.
- Адаптер ресурсов создает объект TransactionalResource и связанные с ним объекты XAResource и Connection.
- Сервер приложений вызывает метод getXAResource.
- Сервер приложений зачисляет ресурс менеджеру транзакций.
- Менеджер транзакций вызывает XAResource.start, чтобы связать текущую транзакцию с ресурсом.
- Сервер приложений вызывает метод getConnection.
- Сервер приложений возвращает ссылку на объект Connection для приложения.
- Приложение выполняет одну или несколько операций с соединением.
- Приложение закрывает соединение.
- Сервер приложений делистирует ресурс при уведомлении адаптера ресурса о закрытии соединения.
- Менеджер транзакций вызывает XAResource.end, чтобы отделить транзакцию от XAResource.
- Сервер приложений просит диспетчер транзакций совершить транзакцию.
- Менеджер транзакций вызывает XAResource.prepare, чтобы сообщить менеджеру ресурсов, чтобы подготовить транзакционную работу для фиксации.
- Менеджер транзакций вызывает XAResource.commit для фиксации транзакции.
Итак, чтобы ответить вам вопрос, а вы называете close()
, соединение будет делистинг, это как-то по-прежнему является удержание менеджером транзакций, так что вы можете смело назвать close()
, прежде чем совершить для предварительного подключения к пулу (если вы беспокоитесь о утечке соединения), хотя многие транзакции Manager помогут автоматически закрыть соединение без необходимости его вручную закрыть (см. Hibernate framework и Transaction Manager).