TimesTen Cacheには、Oracle DatabaseとTimesTen Cacheデータベース間でデータを転送する機能が備えられています。
Oracle DatabaseからTimesTen Cacheデータベースにデータをキャッシュするには、TimesTenにキャッシュ・グループを作成します(このとき、TimesTenでは、各キャッシュ・グループが、Oracle Databaseの単一の表、または外部キー制約で関連付けられた表のグループにマッピングされます)。
この章の内容は次のとおりです。
Oracle Databaseのデータをキャッシュするには、TimesTen Cacheデータベースにキャッシュ・グループを作成します。キャッシュ・グループを作成して、単一のOracle Database表または一連の関連付けられたOracle Database表をキャッシュできます。キャッシュしたOracle Databaseのデータは、Oracle Database表のすべての行および列、または行および列のサブセットで構成できます。
TimesTen Cacheでは、次の機能がサポートされています。
アプリケーションでは、キャッシュ・グループの読取りおよびキャッシュ・グループへの書込みを行えます。
キャッシュ・グループを自動または手動でリフレッシュ(Oracle Databaseのデータをキャッシュ・グループにアップロード)できます。
キャッシュの更新は、Oracle Databaseに自動または手動で送信できます。更新は、同期または非同期で送信できます。
TimesTen Cacheデータベースは、キャッシュ・グループの作成、キャッシュ・グループとOracle Database間の更新の伝播など、すべての同期キャッシュ・グループ処理をOracle Databaseと対話して行います。キャッシュ・エージェントと呼ばれるプロセスは、キャッシュ・グループへのデータのロード、Oracle Databaseからキャッシュ・グループへのデータの手動リフレッシュ、Oracle Databaseからキャッシュ・グループへのデータの自動リフレッシュなどの非同期キャッシュ処理を実行します。
図8-1に、TimesTen Cacheの機能およびプロセスを示します。
各キャッシュ・グループには、そのキャッシュ・グループの主キーが含まれるルート表があります。ルート表の行は、子表の行と1対多の関係を持つことができます。また、その子表の行は、他の子表の行と1対多の関係を持つことができます。
キャッシュ・インスタンスは、外部キー関係によってルート表にある特定行と関連付けられた一連の行です。ルート表のそれぞれの主キー値がキャッシュ・インスタンスを指定します。キャッシュ・インスタンスは、キャッシュのロードとキャッシュのエージングの単位になります。キャッシュ・グループでは、そのグループ内に複数の親を持つ子表が存在することはできません。各TimesTen Cacheレコードが属しているキャッシュ・インスタンスは1つのみであり、また、同じキャッシュ・グループ内に存在する親は1つのみです。
よく使用されるキャッシュ・グループ・タイプは、次のとおりです。
読取り専用キャッシュ・グループ - 読取り専用キャッシュ・グループで実行されるキャッシュ動作では、Oracle Database表にコミットされた更新がTimesTen Cacheデータベースの対応するキャッシュ表に自動的にリフレッシュされます。
非同期のWRITETHROUGH (AWT)キャッシュ・グループ - AWTキャッシュ・グループで実行されるキャッシュ動作では、TimesTen Cacheデータベースのキャッシュ表にコミットされた更新が、自動的に対応するOracle Database表に非同期に伝播されます。
キャッシュ・グループのその他のタイプは、次のとおりです。
キャッシュ・グループは動的にロードするか、または明示的にロードできます。
明示的にロードされるキャッシュ・グループの場合、アプリケーションでは、ロード・キャッシュ・グループ処理を使用して、Oracle Databaseからキャッシュ表に事前にデータがロードされます。これ以降、アプリケーションが必要とするすべてのデータがTimesTen Cacheデータベースで利用可能になります。
動的キャッシュ・グループの場合、アプリケーションでまだTimesTen Cacheに存在しないキャッシュ・インスタンスを参照すると、Oracle DatabaseからTimesTen Cacheにキャッシュ・インスタンスが自動的にロードされます。動的キャッシュ・グループを使用するときは、通常、最低使用頻度(LRU)も使用されます。これにより、最低使用頻度のキャッシュ・インスタンスをキャッシュからエイジ・アウトし、最近使用したキャッシュ・インスタンスを保存するための領域が確保されます。動的キャッシュ・グループの使用は、キャッシュ対象のデータのサイズがTimesTen Cacheデータベースに利用可能なメモリーのサイズを超えている場合に適しています。
すべてのキャッシュ・グループ・タイプ(読取り専用、AWT、SWT、ユーザー管理)は、明示的にロード済として定義することも、動的として定義することもできます。
キャッシュ・グループは、ローカルまたはグローバルのいずれかとして定義できます。
ローカル・キャッシュ・グループでは、データベースが同じキャッシュ・グリッドのメンバーであっても、キャッシュ表のデータがTimesTen Cacheデータベース間で共有されません。したがって、TimesTen Cacheによる調整が行われず、複数のデータベースの内容が重複することがあります。ローカル・キャッシュ・グループは、様々なノード間にデータを論理的にパーティション化するアプリケーションまたは読取り専用キャッシュ・グループに適しています。いずれのキャッシュ・グループ・タイプも、ローカル・キャッシュ・グループとして定義できます。ローカル・キャッシュ・グループは、明示的にロードしたり、動的にすることができます。
グローバル・キャッシュ・グループでは、キャッシュ表のデータが、同じキャッシュ・グリッド内のTimesTen Cacheデータベース間で共有されます。複数のグリッド・メンバーが同じデータを更新する場合は、TimesTen Cache間でデータの読取り/書込みの整合性が確保されるように、グリッドによってそれぞれの更新が調整されます。
動的なAWTキャッシュ・グループおよび明示的にロードされたAWTキャッシュ・グループは、グローバル・キャッシュ・グループとして定義できます。新しいキャッシュ・インスタンスは、リクエストに応じて、グローバル・キャッシュ・グループのキャッシュ表にロードされます。動的なAWTグローバル・キャッシュ・グループに対する問合せには、問合せが行われたローカル・グリッド・メンバー、リモート・グリッド・メンバーまたはOracle Databaseからのデータで対応できます。明示的にロードされたAWTキャッシュ・グループに対する問合せには、ローカル・グリッド・メンバーまたはリモート・グリッド・メンバーからのデータで対応できます。
グローバル・キャッシュ・グループを使用する場合は、まずキャッシュ・グリッドにアタッチされる複数のTimesTen Cacheデータベース間でグローバル・データを管理するキャッシュ・グリッドを定義する必要があります。詳細は、「キャッシュ・グリッド」を参照してください。
キャッシュ・グリッドとは、グローバル・キャッシュ・グループに含まれるアプリケーション・データをまとめて管理するTimesTen Cacheデータベースの集合のことです。キャッシュ・グリッドは、1つ以上のグリッド・メンバーで構成されています。スタンドアロンのTimesTenデータベースまたはアクティブ・スタンバイ・ペアのいずれかをグリッド・メンバーにすることができます。グリッド・メンバーは、中央のOracle DatabaseまたはReal Application Cluster(Oracle RAC)から表をキャッシュします。グローバル・キャッシュ・グループ内のキャッシュ・データは、共有記憶域のない複数のグリッド・メンバーに動的に分散されます。このアーキテクチャによって、キャッシュ・グリッドの容量は、アプリケーションの処理ニーズに応じて拡張できます。ワークロードが増加または減少すると、他のグリッド・メンバーでの操作を妨げることなく、新しいグリッド・メンバーがグリッドにアタッチされたり、既存のグリッド・メンバーがグリッドからデタッチされます。
キャッシュ・グリッド内のTimesTen Cacheデータベースには、明示的にロードされたキャッシュ・グループと動的キャッシュ・グループに加え、すべてのキャッシュ・グループ・タイプのグローバルおよびローカル・キャッシュ・グループを格納できます。キャッシュ・グリッドによって、ノード間でのグローバル・データの整合性が確保されます。
図8-2に、キャッシュ・グリッドを示します。このグリッドには3つのメンバーが含まれており、そのうちの2つはスタンドアロンTimesTen Cacheデータベースであり、1つは読取り専用サブスクライバを使用するアクティブ・スタンバイ・ペアです。読取り専用サブスクライバは、グリッドの一部ではありません。
TimesTen Cacheは、キャッシュ・グループからOracle Databaseに更新を自動的に伝播し、キャッシュ・グループのデータをOracle Databaseで自動的にリフレッシュして、キャッシュ・データとOracle Database間の整合性を確保します。
この項の後半の内容は次のとおりです。
次のメカニズムを使用して、キャッシュ・グループを、Oracle Database表の対応するデータと同期された状態で保持できます。
自動リフレッシュ - 増分自動リフレッシュ操作では、前回のリフレッシュ以降にOracle Databaseで変更されたレコードのみが更新されます。TimesTen Cacheでは、指定された時間間隔で自動的に増分リフレッシュが実行されます。また、指定された時間間隔でキャッシュ・グループ全体を自動的にリフレッシュする完全自動リフレッシュ操作を指定することもできます。
手動リフレッシュ - アプリケーションでREFRESH CACHE GROUP
文を発行し、キャッシュ・グループ全体または特定のキャッシュ・インスタンスをリフレッシュします。これは、キャッシュ・グループまたはキャッシュ・インスタンスをアンロードしてからロードするのと同じことです。
様々な状況で、これらのメカニズムは有効です。Oracle Database表の更新が1日に1回のみ行われ、更新される行数が多い場合は、完全自動リフレッシュが最適です。Oracle Database表の更新頻度は高いものの、それぞれの更新で変更される行数が少ない場合は、増分自動リフレッシュが最適です。また、リフレッシュを実行する必要のあるタイミングがアプリケーションのロジックで既知の場合は、手動リフレッシュが最適です。
伝播およびフラッシュのメカニズムを使用して、Oracle Databaseを、キャッシュ・グループの最新状態と同じ状態で保持できます。
伝播 - キャッシュ・グループ・データをOracle Databaseに伝播する場合に最も一般的な方法は、非同期のWRITETHROUGH(AWT)キャッシュ・グループを使用する方法です。Oracle Database表を更新するその他の方法として、同期のWRITETHROUGH (SWT)キャッシュ・グループを使用する方法や、ユーザー管理キャッシュ・グループにPROPAGATE
オプションを指定する方法があります。
AWTキャッシュ・グループへの変更は、Oracle Database表への適用を待機せずにコミットされます。AWTキャッシュ・グループは、SWTキャッシュ・グループおよびPROPAGATE
オプションを指定したユーザー管理キャッシュ・グループよりもレスポンス時間とパフォーマンスに優れていますが、変更が非同期にOracle Database表に適用されるため、TimesTen CacheデータベースとOracle Databaseに常に同じデータが含まれるわけではありません。
データベースの作成時にパラレル・レプリケーションを構成することで、AWTキャッシュ・グループからOracle Database表へのスループットを向上できます。Oracle Database表に更新を適用するためのスレッド数を構成します。
フラッシュ - フラッシュ処理を使用すると、ユーザー管理キャッシュ・グループからOracle Databaseに更新を手動で伝播できます。アプリケーションでFLUSH CACHE GROUP
文を発行し、フラッシュ処理を開始します。フラッシュ処理は、特定の時間内に複数のレコードに対する更新が頻繁に行われる場合に有効です。フラッシュ処理では、削除は伝播されません。
レコードはTimesTenデータベースから自動的にエイジ・アウトでき、キャッシュ・インスタンスはTimesTen Cacheデータベースから自動的にエイジ・アウトできます。エージングは、使用量ベースまたは時間ベースにすることができます。同じシステムに使用量ベースのエージングと時間ベースのエージングの両方を構成できますが、特定のキャッシュ・グループには1つのタイプのエージングしか定義できません。
動的ロードを使用すると、エージングによって削除済のリクエストされたキャッシュ・インスタンスをリロードできます。
アプリケーションは、TimesTen Cacheへの単一接続を介して、キャッシュ・グループまたはOracle DatabaseのいずれかにSQL文を送信できます。このような単一接続は、図8-3に示すパススルー機能で、SQL文はTimesTen Cacheのキャッシュ表でローカルに処理できるのか、またはOracle Databaseにリダイレクトする必要があるのかをチェックすることによって使用可能になります。パススルー機能の設定では、パススルーの対象とする文の種類とそれを実行する状況が指定されます。パススルー機能の具体的な動作は、TimesTen Cache一般接続属性PassThrough
で制御されます。
アクティブ・スタンバイ・ペアを使用すると、AWTキャッシュ・グループおよび読取り専用キャッシュ・グループをレプリケートできます。
アクティブ・スタンバイ・ペア構成の一部として読取り専用の特殊な障害時リカバリ・サブスクライバを作成することによって、障害全体をリカバリできます。リモートの障害時リカバリ・サイトに存在するこの特殊なサブスクライバは、同じように障害時リカバリ・サイトに存在するもう1つのOracle Databaseに更新を伝播できます。
Oracle TimesTen Cacheアドバイザを使用することで、Oracle Databaseの顧客が、Oracle TimesTen Cache (TimesTenデータベースともいう)を使用した場合に既存のOracle Databaseアプリケーションのパフォーマンスを向上できるかどうかを判断できます。
キャッシュ・アドバイザは、Oracle DatabaseアプリケーションにおけるSQLの使用方法に基づいて、TimesTenキャッシュ・グループ定義の推奨事項を生成します。これは、アプリケーションから収集したSQLワークロードまたは既存のSQLチューニング・セットのいずれかを評価することで実行されます。キャッシュ・アドバイザは、この情報に加えてOracle Databaseオブジェクトのスキーマ定義を分析し、表と列の使用パターンを判定します。また、キャッシュ・アドバイザは特定のOracle TimesTen Cacheサイズのアプリケーション・パフォーマンスも分析するため、キャッシュ・グループの推奨値は指定したキャッシュのサイズに応じて異なる場合があります。
TimesTen Cacheの詳細は、『Oracle TimesTen Application-Tier Database Cacheユーザーズ・ガイド』を参照してください。
キャッシュ・グループのエージングの詳細は、『Oracle TimesTen Application-Tier Database Cacheユーザーズ・ガイド』のキャッシュ・グループでのエージングの実装に関する説明を参照してください。キャッシュ・グループにない表におけるエージングの詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の表へのエージングの実装に関する説明を参照してください。
パススルー機能の詳細は、『Oracle TimesTen Application-Tier Database Cacheユーザーズ・ガイド』のパススルー・レベルの設定に関する説明を参照してください。
キャッシュ・グループのレプリケーションの詳細は、『Oracle TimesTen In-Memory Database開発者および管理者ガイド』のキャッシュ・グループとレプリケーションに関する説明を参照してください。