自動リフレッシュおよび動的ロードを使用する読取り専用キャッシュ・グループに対するロック競合の削減

自動リフレッシュ・リクエストと動的ロード・リクエスト間のロック競合により、アプリケーションがタイムアウトする可能性があります。

自動リフレッシュ処理では、キャッシュされたOracle Database表にコミットされた変更をTimesTenのキャッシュ表に自動的にロードします。動的ロード処理は、(SELECT文から発生した) Oracleデータベースからのデータをリクエストし、その行をキャッシュ・グループに挿入します。自動リフレッシュ処理と動的ロード処理はいずれも、キャッシュ・メタデータへのアクセスが必要であるため、ロック競合が発生する可能性があります。

自動リフレッシュ処理の終了時に、TimesTenによってメタデータが更新され、自動リフレッシュの進行状況が追跡されます。DurableCommits接続属性を1に設定して永続性の保証をリクエストした場合、メタデータに対する自動リフレッシュの更新は常に永続的にコミットされます。DurableCommits接続属性を0 (デフォルト)に設定して永続性の遅延をリクエストした場合、Oracleデータベースに格納された自動リフレッシュ追跡表をガベージ・コレクタがクリーンアップする前に、メタデータに対する自動リフレッシュの更新が永続的にコミットされていることをTimesTenが保証する必要があります。

永続コミットがメタデータに対して開始されると、ファイル・システムにフラッシュされていないトランザクション・ログ・バッファ内の以前にコミットされた非永続トランザクションも永続コミットの一部となります。ファイル・システムがビジー状態または低速状態であるホストでは、動的ロードのリクエストを望ましくないほど長時間にわたってロックアウトしてしまうほど永続コミットが遅くなる可能性があります。

自動リフレッシュ・リクエストと動的ロード・リクエストの間のロック競合のためにアプリケーションがタイムアウトした場合、ttCacheConfig組込みプロシージャを使用して、CacheCommitDurableキャッシュ構成パラメータを0に設定できます。これにより、次の方法によって同じアプリケーションでの自動リフレッシュ・リクエストと動的ロード・リクエスト間のロック競合の発生を削減できます。

  • メタデータに対して行われる自動リフレッシュ変更の非永続コミットを実行します。

  • Oracleデータベースに保存されている自動リフレッシュ追跡表をガベージ・コレクタがクリーンアップする前に、キャッシュ・エージェント内の別のスレッドを使用して自動リフレッシュの変更を永続的にコミットします。これにより、永続コミットが完了するまでガベージ・コレクションが遅延されるため、パフォーマンスがわずかに低下します。

メタデータに対する自動リフレッシュの永続的でないコミットが変更されると、ロックが削除されます。その後は、メタデータのロックが解除され、最近リフレッシュされた表に対する動的なロード要求は待機せずに処理を続行できるようになります。ただし、エラーが発生し、データベース・リカバリが開始した場合は、自動リフレッシュで、障害発生前にディスクにフラッシュされなかったコミット済トランザクションの再適用が必要になる場合があります。

次の例では、CacheCommitDurableを0に設定しています。

call ttCacheConfig('CacheCommitDurable',,,'0');

CacheCommitDurableパラメータの現在の値を問い合せることができます。

call ttCacheConfig('CacheCommitDurable');

『Oracle TimesTen In-Memory Databaseリファレンス』「ttCacheConfig」を参照してください。