Как вы определяете, было ли соединение JDBC получено из источника данных с поддержкой JTA или из прямого JDBC?

StackOverflow https://stackoverflow.com/questions/180713

  •  05-07-2019
  •  | 
  •  

Вопрос

Я использую API поставщика для получения JDBC-соединения с базой данных приложения.API работает при запуске на сервере приложений или при запуске в автономном режиме.Я хочу запустить серию SQL-инструкций в одной транзакции.Меня устраивает, что они происходят в контексте транзакции JTA, если она существует.Однако, если это не так, то мне нужно использовать методы демаркации транзакций JDBC.(Вызов этих методов в соединении JDBC, которое участвует в транзакции JTA, вызывает исключение SQLException.)

Поэтому мне нужно иметь возможность определить, пришло ли Соединение из источника данных с поддержкой JTA или это просто прямое соединение JDBC.

Есть ли прямой способ сделать это определение?

Спасибо!

Это было полезно?

Решение

Даже если это обычный JDBC, у вас может быть включена транзакция JTA.Проверка флага автоматической фиксации НЕ поможет в этом отношении.Вы можете участвовать в транзакции, распределенной или иной, с автоматической фиксацией, имеющей значение false.Значение autoCommit, равное true, сообщит вам, что вы не участвуете в распределенной транзакции, но значение false просто означает, что вы не будете автоматически фиксироваться...это может быть при любом виде транзакции.

Я думаю, вам придется вызвать UserTransaction.GetStatus() и убедиться, что оно не равно Status.NoTransaction() .Это сообщит вам, участвуете ли вы в транзакции JTA.

Другие советы

То, что говорит тило, действительно имеет смысл.

В противном случае, не уверен в прямом пути, но я дам вам "взломанный" способ

напишите ПЛОХОЙ SQL, который, как вы знаете, выдаст исключение DB.Это приведет к трассировке стека.Из трассировки стека вы можете узнать, является ли это производным от JTA соединением или НЕТ?

Вы могли бы попытаться проверить флаг автоматической фиксации соединения, чтобы увидеть, находится ли оно в транзакции (независимо от того, откуда оно пришло). (По-видимому, смотрите принятый ответ, это работает не слишком хорошо.Я не удаляю этот ответ, потому что следующее все еще остается в силе:)

Но я думаю, вам действительно следует изменить свой API, чтобы он зависел исключительно от внешних транзакций.Если вы все еще хотите поддерживать обычный JDBC, перенесите его в отдельный API, который просто запускает транзакцию.

Обновить:Просто перечитайте свой вопрос и увидите, что вы не предоставляете API, но хотите использовать соединение, управляемое контейнером.Но все же, можете ли вы просто обязать (как часть требований вашей заявки), чтобы JTA действовало?Если нет, вы могли бы предоставить параметр конфигурации, позволяющий вернуться к транзакциям, управляемым вручную.Для такой важной функции представляется разумным потребовать правильной конфигурации (в отличие от попыток угадать, что было бы уместно).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top