Имея следующую проблему понимания того, почему сеанс связи существует, который продолжается в течение 6 часов, а также удерживая блокировку и разбивая поток, вопрос расценивается, если для соединения XADataSource (драйвер Oracle) вообще требуется ссылка на Java, чтобы сохранить ее в живых.
С точки зрения распределенной транзакции, установленной до тех пор, пока она не будет явно закрыта (keep-xa-conn-till-tx-complete = true), мне интересно, как драйвер может решить закрыть соединение и совершить транзакцию после того, как GC переработал соединение. Есть ли способ для СУБД сделать это?
Поэтому вопрос заключается в том, как СУБД решает отказаться от распределенной транзакции или нет.
СУБД не принимает решения о прекращении транзакции, что делает диспетчер транзакций.
Менеджер транзакций настроен для работы в ваших контейнерах приложений, будь то Spring, серверы приложений J2EE или что-то еще. Они должны "знать", что они распределены менеджерами транзакций, настроившись правильно. В среде распределенных транзакций, где у вас есть несколько транзакционных приложений и/или служб, взаимодействующих для завершения транзакции, они должны иметь возможность поддерживать распределенные транзакции, чтобы правильно использовать XADataSources и отправлять правильные сигналы вверх и вниз по цепочке для фиксации против отката.
Предполагая, что у вас есть вышеуказанная ситуация, несколько приложений и/или услуг, участвующих в распределенной транзакции, звучит так, как будто один из них настроен неправильно. Что-то в цепочке не является действительно распределенной транзакцией, поэтому, когда она завершается, она только завершается локально и не отправляет сигнал обратно по линии. Таким образом, распределенная транзакция никогда не завершается, удерживая соединение открытым.
Проверьте конфигурацию каждого приложения и/или услуги, участвующих в транзакции. Добавьте вывод журнала на каждый, который определяет, является ли транзакция распределенной или нет. Если вы не можете этого сделать, тогда dd записывает выходные данные в каждый, который записывает начало и конец транзакции. Найдите последнюю точку в последовательности действий, в которых вы видите транзакцию open-transaction, но не транзакцию с близкими транзакциями. Если вы видите это, вероятно, узел сразу после него в цепочке, которая делает что-то неправильно.
Удачи.