powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
25 сообщений из 25, страница 1 из 1
Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
    #38449520
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет. Мне кажется, что помимо рук, это всё-таки проблема на стороне сервлета поэтому пишу в java ветку.
Есть веб приложение на томкате, которое банально вставляет кортеж в таблицу:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
File сlob = new File(pathToUploadedFile); 
        SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy hh:mm:ss");
        String insertStm = "INSERT INTO csv_files (id, document_name, csv_document, ins_date, date_modified) " +
                "   VALUES('" + next_id + "', '" + сlob.getName() + "', ?, SYSDATE, '" +   formatter.format(сlob.lastModified())  + "')";
        PreparedStatement pstmt = conn.prepareStatement(insertStm);
        FileInputStream in = new FileInputStream(сlob);
        pstmt.setCharacterStream(1, new InputStreamReader(in), (int) сlob.length());
        pstmt.execute();
        pstmt.close(); 
        conn.close();
        System.out.println("Disconnected.\n");



На таблицу csv_files смотрит триггер.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE OR REPLACE TRIGGER RUN_FILE_PARCER
 AFTER INSERT
   ON csv_files
   FOR EACH ROW
DECLARE

BEGIN

MAYA_PKG.FILE_PARSER();

END;



Проблема: не работает загрузка файла с включенным триггером.

Если триггер отключить, то все загружается корректно. Если триггер в статусе enable, то, повторюсь, вставка строки в таблицу виснет, триггер не срабатывает (и не дропается, и дисэблиться). При этом соединение через JDBC THIN CLIENT всё еще активно (оно активо и после того как закрываешь браузер).
В чём может быть проблема?

В интернетах написано, что этого из-за того, что веб сервер создает некий пул соединений на всякий случай и поэтому соединения все время остается активным и от этого описываемая проблемы. Но в коде же явно написано
Код: java
1.
2.
  pstmt.close(); 
  conn.close(); 



Помогите.
...
Рейтинг: 0 / 0
Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
    #38449553
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, где, _$%#&, finally?
Во-вторых, вполне логично, что у вас триггер запускает какой-то долгоиграющий парсер FILE_PARSER, соответсвенно транзакция не заканчивается и Java ждет пока сервер распарсит файл. Замените FILE_PARSER на что-то более тривиальное и увидите что проблема ни в Java, ни в триггере.
Если вам надо ждать окончания парсинга в Java, то нужно запускать эту задачу асинхронно по отношению к потоку сервлета.
Если вам нужно просто парсить в фоне, то можно переделать триггер, чтобы он запускался асинхронно, к транзакции вставки. Как это делается вопрос к оракловедам.
...
Рейтинг: 0 / 0
Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
    #38449577
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЕсли вам надо ждать окончания парсинга в Java,
нет, не нужно. от джавы мне нужно просто загрузить файл, а его парсингом занимается субд.

читаю про finally.
...
Рейтинг: 0 / 0
Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
    #38449590
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12
Код: sql
1.
2.
3.
FOR EACH ROW
...
MAYA_PKG.FILE_PARSER();


..триггер не срабатывает...

1. Вызывает удивление, что в процедуруFILE_PARSER не передаются никакие параметры
2. Как определили, что "триггер не срабатывает"?
3. В JAVA код, лично я бы вставил явный вызов commit()
...
Рейтинг: 0 / 0
Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
    #38449630
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
Leonid KudryavtsevВызывает удивление, что в процедуруFILE_PARSER не передаются никакие параметры
так получилось.

Leonid Kudryavtsev2. Как определили, что "триггер не срабатывает"?
возможно не правильно подобрала слова. правильно сказать не работает загрузка при включенном тригере.

Leonid Kudryavtsev3. В JAVA код, лично я бы вставил явный вызов commit()
спасибо. вставлю, но у меня при открытии стоит conn.setAutoCommit(true). еще раз проверю.
...
Рейтинг: 0 / 0
Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
    #38449639
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12нет, не нужно. от джавы мне нужно просто загрузить файл, а его парсингом занимается субд.
но код у вас - синхронный - друг за другом!
...
Рейтинг: 0 / 0
Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
    #38449642
GaraZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12,

если MAYA_PKG.FILE_PARSER(); очень долго отрабатывает то можете попробывать генерировать задания через DBMS_SCHEDULER
тогда вставка будет происходить быстро
а процедура будет отрабатывать в фоне

Хотя странно что процедура без переметров
что она делает?
может получится что при массовой вставке сильно просядет база
...
Рейтинг: 0 / 0
Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
    #38449645
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12не работает загрузка при включенном тригере.
выше сказали - включите ПУСТОЙ триггер ....по логике))
...
Рейтинг: 0 / 0
Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
    #38449660
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12Leonid Kudryavtsev2. Как определили, что "триггер не срабатывает"?
возможно не правильно подобрала слова. правильно сказать не работает загрузка при включенном тригере

Отсюда вывод - проблема скорее всего в триггере
May12Leonid Kudryavtsev3. В JAVA код, лично я бы вставил явный вызов commit()
спасибо. вставлю, но у меня при открытии стоит conn.setAutoCommit(true). еще раз проверю.

Лично я auto commit никогда не использую. Смысла работать с Базой Данных и использовать auto commit не вижу никакого.
...
Рейтинг: 0 / 0
Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
    #38449682
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevОтсюда вывод - проблема скорее всего в триггере
согласна. но теперь проблема, что я не могу сессию срубить, чтобы начать разбираться. =(( вот так да...
...
Рейтинг: 0 / 0
Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
    #38449702
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12Leonid KudryavtsevОтсюда вывод - проблема скорее всего в триггере
согласна. но теперь проблема, что я не могу сессию срубить, чтобы начать разбираться. =(( вот так да...
- не стопорь базу, и не надо будет рубить
- оттестируй пакет через IDE для пакетов
...
Рейтинг: 0 / 0
Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
    #38449708
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12согласна. но теперь проблема, что я не могу сессию срубить, чтобы начать разбираться. =(( вот так да...
Учись рубить. Против топора и лома нет приема.

KILL SESSION...
KILL в linux или ORAKILL в Windows - убьется все (и даже вместе с базой)

На худой конец: семь бед - один резет
...
Рейтинг: 0 / 0
Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
    #38449711
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevУчись рубить. Против топора и лома нет приема.
та это я умею.
...
Рейтинг: 0 / 0
Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
    #38449740
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в общем включила запуск процедуры парсинга в сервлет, но теперь пользователь ощущает на себе длительность работы этой процедуры. =((
...
Рейтинг: 0 / 0
Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
    #38449878
GaraZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GaraZMay12,

если MAYA_PKG.FILE_PARSER(); очень долго отрабатывает то можете попробывать генерировать задания через DBMS_SCHEDULER


попробуйте генерировать задания
если задержка между парсингом и вставкой допустима
...
Рейтинг: 0 / 0
Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
    #38449923
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GaraZ,

сгенерировать джоб??? немного странный вариант. что считать сигналом для генерации задания?
...
Рейтинг: 0 / 0
Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
    #38449925
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GaraZможет получится что при массовой вставке
массовой вставки нет, вставляется одна строка (в неделю).
...
Рейтинг: 0 / 0
Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
    #38449970
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12,
- джоб проверяет галку записи, что запись не пропарсена
- периодичность джоба, хоть раз в секунду. На БД не повлияет.
Либо код парсера сюда. Почему он такой долгий. Парсеры не могут быть долгими.
...
Рейтинг: 0 / 0
Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
    #38449975
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
код парсера отрабатывает за две минуты. 146%.
Petro123- джоб проверяет галку записи, что запись не пропарсена
а тоооооочно.....

+ я сейчас вместо вызова процедуры в триггере напишу
Код: plsql
1.
null;


и посмотрим что будет.
...
Рейтинг: 0 / 0
Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
    #38450023
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12,
хм. триггер:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE OR REPLACE TRIGGER RUN_FILE_PARCER
 AFTER INSERT
   ON csv_files
   FOR EACH ROW
DECLARE

BEGIN

null;

END;


отработал мгновенно.
...
Рейтинг: 0 / 0
Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
    #38450045
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12хм. триггер:
отработал мгновенно.
Невероятно! Всего за 3 часа удалось повторить эксперементально то что уже объяснили выше.
...
Рейтинг: 0 / 0
Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
    #38450064
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, э, нет,
YouTube Video
...
Рейтинг: 0 / 0
Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
    #38450067
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12, ой. извините.
...
Рейтинг: 0 / 0
Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
    #38450116
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12имеется процедура , которая отрабатывает за две минуты. но как только он помещается в джоб то она не отрабатывает. так же при этом не загружается файл веб приложением который парситься это процедурой.
А при чем здесь Java? И что за джоб?
http://stackoverflow.com/questions/1244636/oracle-how-to-execute-an-insert-trigger-without-delaying-the-insert-response
...
Рейтинг: 0 / 0
Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
    #38450278
GaraZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12GaraZ,

сгенерировать джоб??? немного странный вариант. что считать сигналом для генерации задания?

джоб может генерироваться в тригере

но сдается мне что у вас явные проблемы в процедуре
возможно какие то взаимные блокировки

ну вообщем дальше только догадки
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Сервлет на завершает соединение с БД Oracle и поэтому не срабатывает триггер
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]