JBoss автокоммит в Oracle не всегда работает

У меня очень интересная ситуация. Я немного новичок в JBoss и Oracle, работая в основном с Weblogic на DB2. Тем не менее, то, что я пытаюсь сделать, довольно просто.

У меня есть local-tx-datasource для базы данных Oracle. Из моего кода Java I я вызываю datasource.getConnection() после извлечения источника данных, используя соответствующее имя JNDI. Объявление local-tx-datasource в файле my -ds.xml не имеет явной ссылки на поведение автоматической фиксации.

После получения соединения я выполняю запрос на создание / обновление и возвращаю правильный счетчик обновлений. Впоследствии, на короткое время, я даже могу получить эту запись. Тем не менее, после этого база данных делает вид, что она так и не получила запись, и там вообще ничего нет.

Мой опыт работы с соединениями показывает, что это происходит, когда соединение не выполняет свою работу, и поэтому только это соединение сможет видеть данные в своей транзакции. Из того, что я прочитал, JBoss также следует спецификации, что возвращаемое соединение является автокоммитом. Я даже подтвердил это из своего Java-кода, и в нем говорится, что для режима автоматической фиксации установлено значение true. Однако, если это так, почему мои записи не создаются / обновляются?

После этого я установил для свойства автоматического коммита подключения значение false (опять же из кода Java), а затем выполнил фиксацию явно. С тех пор не было никаких проблем.

Что может быть не так? Мое понимание autocommit здесь неверно, или у JBoss есть другая интерпретация этого. Пожалуйста, обратите внимание, у меня нет никаких транзакций вообще. Это очень простые запросы на вставку одной записи.

1 ответ

Пожалуйста, обратите внимание, у меня нет никаких транзакций вообще.

Неправильное предположение. Local-tx-datasource запускает транзакцию JTA от вашего имени. Я не уверен, как работает автокоммит в этом сценарии, но я предполагаю, что автокоммит применяется только тогда, когда вы используете исключительно транзакции JDBC, а не транзакции JTA.

В JTA, если вы не совершите транзакцию [*], она будет отменена после истечения времени ожидания. Это объясняет сценарий, который вы испытываете. Поэтому я бы попытался либо изменить local-tx-datasource на no-tx-datasource, либо вручную зафиксировать транзакцию.

Однако обратите внимание, что неуправление вашими транзакциями - это плохо. Автокоммит всегда следует избегать. Нет лучшего участника для определения того, когда совершать, чем ваше приложение. Передача этой ответственности водителю / контейнеру, IMO, не очень ответственна:-)

[*] Единственное исключение - для операций внутри EJB, чьи бизнес-методы "автоматически" заключаются в транзакцию JTA. Таким образом, вам не нужно явно фиксировать транзакцию.

Другие вопросы по тегам