Уведомление об изменении базы данных Oracle и ROWID - PullRequest
6 голосов
/ 18 сентября 2011

Oracle функция уведомления об изменении базы данных отправляет идентификаторы строк (физические адреса строк) при вставке, обновлении и удалении строк. Как указано в документации оракула, эта функция может использоваться приложением для создания кэша среднего уровня. Но это, кажется, противоречит, когда мы подробно рассмотрим, как работают идентификаторы строк.

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

Исходя из вышеизложенного исследования, кажется небезопасным использовать rowid, отправленный во время уведомления об изменении базы данных, в качестве ключа в кеше приложения, верно? Это также поднимает вопрос: следует ли использовать функцию уведомления об изменении базы данных для построения кэша сервера приложений? или дается рекомендация перезапустить все кластеры сервера приложений (для перезагрузки / обновления кэша), когда таблицы кэшируемых объектов подвергаются каким-либо операциям, которые приводят к изменению rowid? Будет ли это хорошим предположением для производственных сред?

1 Ответ

5 голосов
/ 18 сентября 2011

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

Единственной проблемной операцией является обновление, вызывающее перемещение в другой раздел.Но это случается редко, потому что это противоречит цели разделения, по крайней мере, если это происходило регулярно.Разработчик конкретной схемы базы данных сможет сообщить вам, может ли такая операция произойти и имеет ли она отношение к кешированию.Если ни в одной из таблиц не установлено ENABLE ROW MOVEMENT, вам даже не нужно спрашивать дизайнера.

Что касается дублирования идентификаторов ROWID: идентификаторы ROWID не являются уникальными во всем мире, они уникальны в таблице.И вам дают и ROWID и имя таблицы в уведомлении об изменении.Таким образом, кортеж ROWID и имя таблицы - это идеальный уникальный ключ для создания надежного кэша.

...