2013-06-18 3 views
1

У нас есть ежедневное пакетное задание, выполняющее функцию oracle-plsql. На самом деле кварцевый планировщик вызывает программу java, которая вызывает вызов функции oracle-plsql. Эта функция placq оракула удаляет данные (более 6 месяцев) из 4 таблиц и затем совершает транзакцию.oracle: время ожидания соединения при вызове процедуры plsql из Java

Это пакетное задание успешно выполнялось в тестовой среде, но началось с сбоя, когда новые данные были сброшены в таблицы, которые произошли 2 недели назад (код должен быть выпущен на этой неделе). Раньше количество строк в каждой таблице составляло не более 0,1 млн. Но сейчас это 1 миллион в 3 таблицах и 2,4 миллиона в другой таблице.

После запуска в течение 3 часов мы получаем ошибку в java (записано в файле журнала) «... Сброс соединения, вложенное исключение - это java.sql.SQLException: исключение Io: сброс соединения ...» , Когда проверяется количество строк в таблицах, было ясно, что ни одна запись не была удалена из любой из таблиц.

Возможно ли это в базе данных оракула, чтобы процедура/функция plsql была автоматически завершена/убита, когда время соединения завершено, а сеанс вызова больше не активен?

Заранее спасибо, Pradeep.

ответ

1

PL/SQL не завершает , потому что неактивен, поскольку по определению это не так - он все еще что-то делает. Тем не менее, он не будет генерировать какой-либо сетевой трафик для вашего клиента.

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

Когда сетевое соединение прерывается, Oracle в какой-то момент заметит и прекратит сеанс. Это приведет к прекращению вызова PL/SQL, и это приведет к тому, что любая работа, которую он выполнил, будет отменена, что может занять некоторое время.

3 часа, кажется, длительное время для ваших удалений, хотя даже для нескольких миллионов записей. Возможно, вы удаляете неэффективно, с отдельными вставками в вашей процедуре. Это, конечно, не поможет вам. Возможно, стоит отметить, что ваша производственная среда может не иметь каких-либо параметров, убивающих ваше соединение, или может иметь более короткий тайм-аут, поэтому даже сокращение времени выполнения может не сделать его пуленепробиваемым в режиме реального времени. Вероятно, вам нужно найти источник тайм-аута и проверить эквивалент в live env. чтобы попытаться упредить подобные проблемы там.

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