JBoss автокоммит в Oracle не всегда работает - PullRequest
0 голосов
/ 12 мая 2011

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

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

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

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

После этого я установил поведение автокоммитирования Connection на false (снова из кода Java), а затем явно сделал коммит. С тех пор не было никаких проблем.

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

1 Ответ

1 голос
/ 12 мая 2011

Обратите внимание, у меня вообще нет транзакций.

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

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

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

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

...