Push vs polling с веб-службой на iPhone

Я использую библиотеку ASIHttpRequest, чтобы каждую минуту запрашивать обновления у веб-службы. Приложение получает строку json и анализирует ее. Работает нормально.

Но я ' + --------- + + -------------------- + + ---------- + | docId | | docStatusHistoryId | | ...

Допустим, у нас есть следующие структуры таблиц:

documents      docmentStatusHistory      status
+---------+   +--------------------+    +----------+
| docId   |   | docStatusHistoryId |    | statusId |
+---------+   +--------------------+    +----------+
| ...     |   | docId              |    | ...      |
+---------+   | statusId           |    +----------+
              | ...                |
              +--------------------+

Это может быть очевидно, но стоит отметить, что текущий статус документа - это последний введенный в историю статусов.

Система работала медленно, но медленно. производительность, безусловно, ухудшается, и я предложил изменить приведенную выше структуру на:

documents           docmentStatusHistory      status
+--------------+   +--------------------+    +----------+
| docId        |   | docStatusHistoryId |    | statusId |
+--------------+   +--------------------+    +----------+
| currStatusId |   | docId              |    | ...      |
| ...          |   | statusId           |    +----------+
+--------------+   | ...                |
                   +--------------------+

Таким образом, мы будем иметь текущий статус документа там, где он должен быть.

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

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

Я создал триггер, который обновляет текущий статус документа каждый раз, когда новый статус добавляется в историю статусов, и он работает как чудо.

Однако в неясной и редко используемой ситуации возникает необходимость to УДАЛИТЬ последнюю историю статусов вместо простого добавления нового. Итак, я создал следующий триггер:

create or replace trigger trgD_History
 after delete on documentStatusHistory
 for each row
 currentStatusId number;
begin

  select statusId
    into currentStatusId
    from documentStatusHistory
   where docStatusHistoryId = (select max(docStatusHistoryId)
                                 from documentStatusHistory
                                where docId = :old.docId);

  update documentos
     set currStatusId = currentStatusId
   where docId = :old.docId;
end;

И здесь я получил печально известную ошибку ORA-04091 .

Я понимаю ПОЧЕМУ Я получаю эту ошибку, хотя Я настроил триггер как триггер ПОСЛЕ .

Дело в том, что я не вижу способа обойти эту ошибку. Некоторое время я искал в сети и пока не нашел ничего полезного.

Со временем мы используем Oracle 9i.

5
задан skaffman 27 April 2011 в 14:49
поделиться