2016-08-25 1 views
1

Мы используем комбинацию Oracle 11G и JDK1.8. В нашем приложении мы используем транзакцию XAConnection, XAResource для DB. т.е.) распределенные транзакции.Как разрешить распределенную транзакцию java.sql.SQLException, ожидающую блокировки

В некоторых случаях нам нужно убить наш Java-процесс, чтобы остановить приложение. После убийства, если мы перезапустим наше приложение, мы получаем исключение ниже при выполнении транзакции БД.

java.sql.SQLException: ORA-02049: timeout: distributed transaction 
waiting for lock 

После этого в течение нескольких часов мы не можем использовать наше приложение до момента блокировки.

Может ли кто-нибудь предоставить мне какое-то решение, чтобы мы могли продолжить работу, а не ждать выхода замка.

Я попробовал вариант ниже:

а) принес SID и убил сессию, используя изменить command.After это также блокировка таблицы не выпущен.

У меня есть очень небольшое количество данных.

+0

Как вы убили сеанс - с помощью опции «немедленного»? Убийство процесса Java похоже на тяжелый подход. Нельзя добавить механизм для запуска чистого выхода; или это приложение в состоянии, в котором оно не будет отвечать в любом случае? –

+0

Есть ли строка в dba_2pc_pending для ожидающей распределенной транзакции, которая может быть совершена или откат? –

+0

@justin Cave Нет строк в dba_2pc_pending – ThirumalMarugan

ответ

0

Я следил за одной темой, подобной той, что и с tips about what to do with distributed connections.

Соединения Oracle остаются открытыми до тех пор, пока вы не закончите свою локальную сессию или пока количество ссылок на базы данных для вашего сеанса не превысит значение OPEN_LINKS. Чтобы уменьшить сетевые издержки, связанные с открытием ссылки на базу данных, используйте этот раздел, чтобы закрыть ссылку явно, если вы не планируете использовать ее снова в своем сеансе.

Я считаю, что, закрыв ваши соединения и сеансы после выполнения DDL, эта проблема не должна произойти.

Другая возможность предоставляется на this question:

Одним из возможных путей может быть увеличение параметра init.ora для distributed_lock_timeout на большее значение. Это даст вам больше времени для наблюдения за таблицей блокировки v $, так как блокировки продолжатся дольше. Для достижения этой цели вы можете либо - Запуск задания SQL каждые 5-10 секунд, который регистрирует значения блокировки v $ или запрос, который сандоны указали выше, в таблицу, а затем проанализировать его, чтобы увидеть, какая сессия вызывает замок. - Запустите отчет STATSPACK или AWR. Заседания, которые были заблокированы, должны отображаться с большим прошедшим временем и, следовательно, могут быть идентифицированы. v $ session имеет еще 3 столбца blocking_instance, blocking_session, blocking_session_statusthat можно добавить к запросу выше, чтобы дать изображение того, что становится заблокированным.

Надеюсь, я помог вам, мой друг.

 Смежные вопросы

  • Нет связанных вопросов^_^