Согласно документам Hibernate, в среде JTA режим освобождения соединения по умолчанию — after_statement, что означает, что после каждого оператора логическое соединение, находящееся в состоянии гибернации, освобождается.
Когда логическое соединение освобождается, вызывается метод Connection close(), и текущий ресурс удаляется из списка диспетчера транзакций.
Согласно RedHat руководству разработчика транзакций< /а>:
«Метод delistResource используется для отделения указанного ресурса от контекста транзакции в целевом объекте. Сервер приложений вызывает метод с двумя параметрами:
An XAResources object, which represents the resource.
A flag to indicate whether the operation is due to the transaction being suspended (TMSUSPEND), a portion of the work has failed (TMFAIL), or a normal resource release by the application (TMSUCCESS)."
Поскольку Bitronix использует TMSUCCESS:
currentTransaction.delistResource(xaResourceHolderState.getXAResource(), XAResource.TMSUCCESS);
Это означает, что соединение отключено от текущей ветки транзакций, и иногда вы можете получить зачисление 2 разных соединений для одного и того же адаптера ресурсов.
Я думаю, что удержание соединения до тех пор, пока выполняется транзакция, является лучшим выбором, поскольку мы обычно выполняем более одного оператора за транзакцию. Таким образом, режим выпуска after_transaction звучит более привлекательно.
Является ли режим выпуска after_transaction более подходящим для Bitronix? Кто-нибудь сталкивался с этим в производственной среде?