読取り専用キャッシュ・グループ

読取り専用キャッシュ・グループでは、TimesTenキャッシュ表を直接更新できず、キャッシュされたOracle Database表にコミットされた変更がキャッシュ表に自動的にリフレッシュされるというキャッシュ動作が実行されます。

図4-5を参照してください。

図4-5 読取り専用キャッシュ・グループ

図4-5の説明が続きます。
「図4-5 読取り専用キャッシュ・グループ」の説明

なんらかの理由でTimesTenデータベースを利用できない場合でも、読取り専用キャッシュ・グループにキャッシュされているOracle Database表は更新できます。TimesTenデータベースが処理を再開すると、TimesTenデータベースが利用できなかった間にキャッシュされたOracle Database表でコミットされた更新が、TimesTenキャッシュ表に自動的にリフレッシュされます。

TimesTen ClassicとTimesTen Scaleoutのどちらも、読取り専用キャッシュ・グループをサポートしています。TimesTen Classicでは、すべての読取り専用キャッシュ・グループをサポートしています。TimesTen Scaleoutでは、増分自動リフレッシュを使用した静的な読取り専用のキャッシュ・グループのみをサポートしています。『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』「TimesTen Scaleoutでのキャッシュ・グループの使用」を参照してください。

ノート:

TimesTenで読取り専用キャッシュ・グループの処理を管理する場合、Oracleキャッシュ管理ユーザーの名前およびパスワードを使用してOracleデータベースに接続します。詳細は、「キャッシュ管理ユーザーの名前およびパスワードの登録」を参照してください。

Oracle Databaseの場合:

次に、読取り専用キャッシュ・グループにキャッシュされるOracle Database表の定義の例を示します。Oracle Database表は、スキーマ・ユーザーsalesが所有しています。

CREATE TABLE customer
(cust_num NUMBER(6) NOT NULL PRIMARY KEY,
 region   VARCHAR2(10),
 name     VARCHAR2(50),
 address  VARCHAR2(100));

CREATE TABLE orders
(ord_num      NUMBER(10) NOT NULL PRIMARY KEY,
 cust_num     NUMBER(6) NOT NULL,
 when_placed  DATE NOT NULL,
 when_shipped DATE NOT NULL);

読取り専用キャッシュ・グループに含まれるキャッシュ表の場合、Oracleキャッシュ管理ユーザーには、これらのキャッシュ表に対するSELECT権限が付与されている必要があります。この例では、これらの表はsales.customer表とsales.orders表です。

様々なアクティビティに必要なすべての権限は、「キャッシュ処理のキャッシュ管理ユーザーに必要な権限」を参照してください。

Oracle Databaseで、管理者として接続して次の権限を付与します:

SQL> GRANT SELECT ON sales.customer TO cacheadmin;
SQL> GRANT SELECT ON sales.orders TO cacheadmin;

TimesTenデータベースの場合:

TimesTenキャッシュ管理ユーザーとして接続します。読取り専用キャッシュ・グループを作成するには、CREATE READONLY CACHE GROUP文を使用します。

次の文では、sales.customer表(ルート表)およびsales.orders表(子表)をキャッシュする読取り専用キャッシュ・グループcustomer_ordersが作成されます:

CREATE READONLY CACHE GROUP customer_orders
FROM sales.customer
 (cust_num NUMBER(6) NOT NULL,
  region   VARCHAR2(10),
  name     VARCHAR2(50),
  address  VARCHAR2(100),
  PRIMARY KEY(cust_num)),
sales.orders
 (ord_num      NUMBER(10) NOT NULL,
  cust_num     NUMBER(6) NOT NULL,
  when_placed  DATE NOT NULL,
  when_shipped DATE NOT NULL,
  PRIMARY KEY(ord_num),
  FOREIGN KEY(cust_num) REFERENCES sales.customer(cust_num));

デフォルトでは、すべての読取り専用キャッシュ・グループは、デフォルトの間隔値で一時停止された増分自動リフレッシュで定義されます。キャッシュ表が空であるため、読取り専用キャッシュ・グループの最初のロードに対してLOAD CACHE GROUP文を実行します。自動リフレッシュの状態は、LOAD CACHE GROUP文が完了すると、PAUSEDからONに変わります。

読取り専用キャッシュ・グループ内のキャッシュ表は直接更新できません。ただし、パススルー・レベルを2に設定すると、TimesTenキャッシュ表に対して発行されたコミット済の更新処理をパススルーし、キャッシュされたOracle Database表上で処理してから、更新を自動的にキャッシュ表にリフレッシュできます。「パススルー・レベルの設定」を参照してください。

読取り専用キャッシュ・グループ内のキャッシュ表に対する、パススルーされた文の影響は、更新処理が発行されたトランザクションでは発生しません。かわりに、この影響は、パススルーされた更新処理がOracle Databaseにコミットされ、キャッシュ・グループの次の自動リフレッシュが実行された後に発生します。パススルーされた更新処理をキャッシュされたOracle Database表で実行するには、Oracleキャッシュ管理ユーザーに、読取り専用キャッシュ・グループにキャッシュされるOracle Database表に対するINSERTUPDATEおよびDELETE権限が付与されている必要があります。

「initCacheAdminSchema.sqlスクリプト」の説明に従って、自動リフレッシュを使用したキャッシュ・グループの定義済動作を実行するために使用されるOracle Databaseオブジェクトを手動で作成した場合は、キャッシュ・グループを作成するときに、自動リフレッシュ状態をOFFに設定する必要があります。

次に、ttIsqlユーティリティのcachesqlgetコマンドを実行して、読取り専用キャッシュ・グループにキャッシュされるOracle Database表ごとに、Oracle Database内にログ表およびトリガーを作成するSQL*Plusスクリプトを生成する必要があります。これらのオブジェクトの作成方法の詳細は、「自動リフレッシュを使用したキャッシュ・グループ用のOracle Databaseオブジェクトの手動作成」を参照してください。