Базы данных Oracle - статьи

         

Кэширование данных “только для чтения”


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

Прежде, чем будет создан кэш данных телефонов/адресов только для чтения, следует создать пользователя – администратора кэша в Oracle Database. Этот пользователь владеет триггерами и таблицами, которые Oracle TimesTen создает в Oracle Database для отслеживания изменений в данных таким образом, чтобы они могли быть использованы для эффективного обновления кэшированных данных в Oracle TimesTen. Например, войдя в систему как пользователь system, выполните следующий оператор, чтобы создать администратора кэша с именем ttdispatch:

CREATE USER ttdispatch identified by ttdispatch default tablespace users quota unlimited on users;

Затем выполните следующие операции предоставления привилегий, чтобы позволить администратору кэша создавать триггеры для таблиц, принадлежащих другим пользователям (например, владельцу схемы DISPATCH):

grant create any trigger to ttdispatch;

Затем войдите в систему, как владелец схемы отправки, и предоставьте администратору кэша доступ SELECT к таблице TELEPHONES:

GRANT SELECT ON phones TO ttdispatch;

Теперь переключитесь к Oracle TimesTen и создайте группу кэша. Чтобы сделать это:

  • Находясь в ttIsql, соединитесь с вашим хранилищем данных.
  • Сделайте вызов встроенной процедуры ttCacheUidPwdSet() и специфицируйте для Oracle TimesTen имя пользователя/пароль, чтобы использовать их при соединении с Oracle Database как администратор кэша.
  • Вызовите ttCacheStart(), чтобы запустить агент кэширования TimesTen, который является ответственным за выполнение фактической работы по поиску данных из Oracle Database и кэширование этих данных в Oracle TimesTen.

  • Выполните оператор CREATE CACHE GROUP, чтобы определить группу связанных таблиц – в этом случае, только одну таблицу – для кэширования в Oracle TimesTen.


  • В листинге 2 показаны все четыре этих шага.

    Листинг 2.Создание группы кэша “только для чтения”

    Command> connect dsn=ttdispatch; Connection successful: . . . Command> call ttCacheUidPwdSet('ttdispatch','ttdispatch'); Command> call ttCacheStart(); Command> Command> CREATE READONLY

    > CACHE GROUP phone_data > AUTOREFRESH > INTERVAL 5 MINUTES > FROM dispatch.phones ( > phone_num VARCHAR(8) NOT NULL PRIMARY KEY, > street_addr VARCHAR(20), > city VARCHAR(15) > ); Warning 5112: Cache table DISPATCH.PHONES contains VARCHAR column(s). Oracle VARCHAR comparison rule is different. (Предупреждение 5112: Кэшированная таблица DISPATCH.PHONES содержит столбец(цы) VARCHAR. Правила сравнения для VARCHAR в Oracle отличаются.)

    Заметьте, что предупреждающее сообщение в конце листинга 2 служит напоминанием о том, что Oracle TimesTen считает пустую (незаполненную) строку (") не пустой (non-null), тогда как Oracle Database трактует пустую (empty) строку как пустую (null). При написании запросов с участием столбцов VARCHAR вы должны обращать внимание на подобные различия в поведении.

    Теперь у вас имеется группа кэша, названная phone_data. В составе этой группы имеется единственная пустая таблица по имени TELEPHONES. Для группы кэша устанавливается автоматическое обновление, для чего с пятиминутным интервалом производится опрос Oracle Database относительно изменений в данных. Однако, такое автоматическое обновление первоначально выполняется в приостановленном состоянии (во время паузы). Выполните оператор LOAD CACHE GROUP, показанный в листинге 3, чтобы инициализировать кэш текущими данными из Oracle Database и вывести группу кэша из паузы. Начиная с этого момента, каждые пять минут Oracle TimesTen будет делать запросы к Oracle Database (вы можете указать большие или меньшие интервалы) об изменениях в таблице TELEPHONES. Триггеры и таблицы поддержки, принадлежащие администратору кэша (в этом случае, ttdispatch) делают такой опрос весьма эффективным.

    Листинг 3. Выполнение начальной загрузки

    Command> SELECT * FROM phones; 0 rows found.

    Command> LOAD CACHE GROUP phone_data > COMMIT EVERY 100 ROWS; 6 rows affected.

    Command> select * from phones; < 555-1234, 100 W. Munising Ave, Munising > < 555-2345, 101 E. Varnum, Munising >

    < 555-3456, E2904 S. First, Trenary > < 555-4567, N3284 M-67, Limestone > < 555-5678, N7569 Spruce St., AuTrain > < 555-6789, 112 Colwell, Grand Marais > 6 rows found.


    Содержание раздела