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