Как справиться с тупиком / зависанием в jdbc с базой данных oracle? - PullRequest
1 голос
/ 19 сентября 2011

Я написал приложение, которое использует jdbc для вставки записей в таблицу A. Теперь я обнаружил, что вставляю запись в таблицу из другого клиента и не фиксирую.мое приложение будет зависать при вставке SQL, пока я не передам изменения от другого клиента.
Как я могу избежать этой проблемы?Я не хочу, чтобы мое приложение ожидало, пока другой клиент не внесет свои изменения.

Ответы [ 2 ]

3 голосов
/ 19 сентября 2011

INSERT обычно не должны ждать друг друга.

Единственное исключение - это когда вы пытаетесь вставить один и тот же (первичный) ключ из двух одновременных транзакций:

  • перваяодин для достижения INSERT будет продолжаться в обычном режиме,
  • , но второй остановится на своей INSERT до тех пор, пока первый не выполнит коммит (вызывающий нарушение ключа во втором) или не откатится (что позволит второму продолжитьобычно).

Взаимодействия между UPDATE и INSERT или даже DELETE и INSERT также могут вызывать аналогичные сбои.

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

Если, однако, у вас есть куча клиентских приложений, останавливающих друг друга на длительные периоды времени, вы должны попытаться сократить продолжительность транзакций илиперепроектировать вашу базу данных (например, с помощью SEQUENCE, чтобы гарантировать автоматическое назначение уникального PK)и / или клиентская логика, так что эти виды "конфликтов" сводятся к минимуму.

1 голос
/ 24 июня 2013

То, что упомянул Бранко, является одной из причин.Это ошибка, которую я совершил при отладке приложений с использованием транзакционного запроса, когда я просто прекращаю отладку после выполнения запроса вставки без фиксации / отката с помощью тонкого клиента oracle.jdbc.OracleDriver.

Однако , чтоздесь не упоминается, что если вам случится запустить клиентский браузер SQL, т. е. SQL Developer, чтобы проверить вашу таблицу или одновременно проверить оператор вставки, они также являются виновниками, способствующими замораживанию.В режиме отладки при пошаговом выполнении кода (т. Е. Statement.executeUpdate ();) вы заметите, что ваш код, кажется, ожидает ответа сервера бесконечно ... очень долго ... без исключения.Это происходит, если вы снова выполните предыдущий незафиксированный запрос.И вы обнаружите, что ваше соединение с браузером SQL также затронуто.

Это также зависит от того, как вы построите запрос

i.e: 
insert into TB1(ID, Name) values (1, 'User1') x 2 times w/o commit --> freeze on 2nd time 
insert into TB1(ID, Name) values (SEQ.nextval, 'User1') x 2 times w/o commit --> OK, won freeze on 2nd time 
*where ID = auto number* 

Решение:

Остановите сервер отладки / выполнениякоторые управляют соединением.Закройте / отключите все ваши браузеры SQL.Самый простой способ - закрыть браузер SQL, перезапустить IDE eclipse / netbean, если вы не уверены.

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

Не используйте транзакционный запрос, если в этом нет необходимости, путем установки объекта Connection:

<connection>.setAutoCommmit(true)
...