powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-01555: слишком старый снимок при dbms_aq.dequeue
4 сообщений из 4, страница 1 из 1
ORA-01555: слишком старый снимок при dbms_aq.dequeue
    #39838569
роман23t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем добрый день.

Почему может возникать ошибка ORA-01555 при вычитке из очереди?

В пакете есть функция получения одного сообщения из очереди и процедура, которая пока очередь не пуста, обрабатывает в цикле по 1 сообщению. Соответственно вычитка 1 сообщения и его обработка в теле занимает короткое время. Ошибка возникает на сточке dbms_aq.dequeue(queue_name => 'uninew.my_queue_q',

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
  function f_get_queue_mes return my_type
  as
    v_dequeue_options    dbms_aq.dequeue_options_t;
    v_message_properties dbms_aq.message_properties_t;
    v_message_handle     raw(16);
    v_obj                sys.anydata;
    v_var                my_type := my_type();
    v_res                number;
    no_message           exception;
    pragma               exception_init(no_message,-25228);
  begin   
    v_dequeue_options.navigation := dbms_aq.first_message;
    v_dequeue_options.wait       := dbms_aq.no_wait;
  
    dbms_aq.dequeue(queue_name         => 'my_queue_q',
                    dequeue_options    => v_dequeue_options,
                    message_properties => v_message_properties,
                    payload            => v_obj,
                    msgid              => v_message_handle);
                    
    v_res := v_obj.getobject(v_var);    
    
    return v_var;   
  exception
    --если очередь пустая, ничего не делаем
    when no_message
      then return null;                   
  end; 
  
  
  procedure p_proc as
    v_arr   my_type := my_type();
  begin
    --основная процедура обработки очереди
    loop
      begin
        v_arr := f_get_queue_mes;
        if v_arr is null then
          exit;
        end if;
        
        --действия с сообщением
      end;
      commit;
    end loop;
  end;  




Периодически возникает ORA-01555: слишком старый снимок


в моем понимании такая ошибка характерна для ситуации, когда один запрос долго выполняется, заканчивается сегмент отката и она возникает. Например

Код: plsql
1.
2.
3.
4.
5.
6.
begin
  for rec in (select * from long_time_queue)
  begin
    proc(rec.id);
  end;
end;
...
Рейтинг: 0 / 0
ORA-01555: слишком старый снимок при dbms_aq.dequeue
    #39838829
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
роман23t,

Код: plsql
1.
2.
3.
4.
 
  v_res := v_obj.getobject(v_var);    
   commit;
  return v_var;   
...
Рейтинг: 0 / 0
ORA-01555: слишком старый снимок при dbms_aq.dequeue
    #39838831
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
feagor,

Посмотрите еще вот тут Может ваш случай
...
Рейтинг: 0 / 0
ORA-01555: слишком старый снимок при dbms_aq.dequeue
    #39839095
роман23t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня коммит хоть сразу после вычитки не стоит, но он в каждой итерации цикла. Одна итерация занимает меньше секунды, за это время никакие переполнение невозможно. В потрохах обработчиков сообщений нет автономок. Правда есть отправка SOAP сообщений(едва ли это может быть причиной)

В приведенном примере за 2006 года автор сказал, что помог патч на 9 версию oracle.... В моем случае 12с, едва ли ошибка "снова появилась". Да и у меня пользовательский тип с 5 полями скалярных типов, без LOB
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-01555: слишком старый снимок при dbms_aq.dequeue
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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