ユーザーガイド > TDVキャッシング > キャッシュ更新動作の定義 > プルベースのインクリメンタルキャッシュの設定
 
プルベースのインクリメンタルキャッシュの設定
プルベースのインクリメンタルキャッシングは、TDVキャッシングメカニズムと2つのスクリプトを使用して設定できます。プルベースのインクリメンタルキャッシングでは、ユーザーまたはクライアントアプリケーションは、キャッシュのコピーを集中管理されるキャッシュコピーと同期するように要求する必要があります。キャッシュの作成と更新に使用されるスクリプトはユーザーが定義するため、状況に応じてスクリプトを複雑なものにすることも、シンプルなものにすることもできます。スクリプトは、SQLまたはカスタムJavaプロシージャを使用して定義できます。プロシージャには、変更された行を識別するロジックが必要です。
このトピックでは、プルベースの方法でインクリメンタルキャッシングを定義するために必要なスクリプトを作成するための一般的な手順について説明し、次のサンプルスクリプトを提供します。
プルベースのインクリメンタルキャッシュの初期化サンプルスクリプト
プルベースのインクリメンタルキャッシュの更新サンプルスクリプト
プルベースのインクリメンタルキャッシングを設定するには
1.最後のキャッシュ更新以降にデータがどのように変更されたかを判断するために使用できる、信頼できる一意の識別子をデータソース内で見つけるか、作成します。この一意の識別子として、システム変更番号、ログシーケンス番号(LSN)、TIMESTAMPなどがあります。通常は、キャッシュキー列を使用して、更新されたデータを判別できます。
2.Javaプロシージャ」または「カスタムJavaプロシージャの追加」の手順を使用して、新しいSQLスクリプトまたはJavaプロシージャを作成します。
既存のSQLスクリプトまたはプロシージャを使用するには、Studioリソースツリー内で目的のスクリプトまたはプロシージャを見つけます。
3.キャッシュのスクリプトまたはプロシージャにVARCHAR出力パラメーターが1つあることを確認します。
4.Studioで使用する次のTDV API呼び出しを評価します。これらのAPI呼び出しは<localhost>/lib/utilにあります。
GetEnvironment — プルベースのインクリメンタルキャッシングSQLスクリプトに1つ以上のシステムプロパティを返すために使用できます。
GetProperty — プルベースのインクリメンタルキャッシングカスタムJavaプロシージャに1つ以上のシステムプロパティを返すために使用できます。具体的には、この呼び出しを使用してサーバーIDを取得できます。
操作可能なシステムキャッシングプロパティは次のとおりです。
System.CACHED_RESOURCE_PATH
System.CACHED_RESOURCE_TYPE
System.CACHED_RESOURCE_PARAM_KEY
System.CACHE_DATASOURCE_PATH.
System.CACHED_RESOURCE_CACHE_KEY
System.CACHED_RESOURCE_BUCKET_PATH.
System.CACHED_RESOURCE_REFRESH_OUTCOME
System.CACHED_RESOURCE_ERROR_MESSAGE
System.CACHED_RESOURCE_INCREMENTAL_MAINTENANCE_LEVEL
5.libディレクトリーの下にある他の関数を確認し、それらの関数がプルベースのインクリメンタルキャッシングに必要なアクションを実行するのに役立つかどうかを判断します。次のような関数も役立つ可能性があります。
CreateResourceCacheKey()は、新しいキャッシュキー値を生成する場合に呼び出されます。
LoadResourceCacheStatus()は、進行中の更新をサーバーに通知する場合に呼び出されます。
LoadResourceCacheStatus()は、新しくアクティブになったデータをサーバーに通知する場合に呼び出されます。
TestDataSourceConnectionは、データソースの接続が機能しているかどうかをテストする場合に使用します。
ClearResourceCache(path, type)は、リソースのキャッシュをクリアする場合に使用します。
UpdateResourceCacheKeyStatus(path, type, cacheKey, status, startTime, message)は、指定したリソースのキャッシュキーを更新する場合に使用します。
GetResourceCacheStatusProcedureは、外部キャッシュのロードをサポートする場合にCreateResourceCacheKeyおよびUpdateResourceCacheKeyStatusとともに使用します。指定されたキャッシュキーのキャッシュステータス情報を返します。
6.次のロジックのいくつかを使用してキャッシングロジックを制御することを検討します。
ステータステーブルは、現在アクティブなキャッシュキーを見つける場合に照会されます。キャッシュキーは、サーバーID、リソースパスを含み、ステータス列の値が「A」の行にあります。INSERT、UPDATE、およびDELETE操作は、キャッシュキーをフィルターとして使用してデータテーブルに対して実行できます。これにより、他のキーの更新を回避できます。
必要に応じて、INSERTおよびその他の操作を実行してストレージテーブルに新しい行を作成し、そのような行のすべてに新しいキャッシュキー値があることを確認します。これの操作は、完了時にコミットできるように、独立したトランザクションで実行する必要があります。
ステータステーブルに対してINSERTを実行し、サーバーID、リソースパス、キャッシュキー、「I」に設定されたステータス、現在の時刻に設定された開始時刻(進行中の更新であることを示します)を挿入します。これの操作は、即座にコミットできるように、独立したトランザクションで実行する必要があります。
ステータステーブルの、ステータスが「A」になっているサーバーIDとリソースパスを含むすべての行のステータスを「C」に更新します。これにより、以前のアクティブなキャッシュデータがクリア対象としてマークされます。次に、ステータステーブルの、サーバーID、リソースパス、キャッシュキーを含む行のステータスを「A」に、終了時刻を現在の時刻に更新します。これは、このキャッシュキーが新しいアクティブなキーであることを示します。これの操作は、即座にコミットできるように、独立したトランザクションで実行する必要があります。
7.スクリプトまたはプロシージャを保存します。
8.Studioで、プルベースのインクリメンタルキャッシングを定義する、キャッシングが有効になっているビューまたはプロシージャを開きます。
注意: キャッシュオブジェクトが最新バージョンのTDVより前に作成された場合は、それらの再作成が必要になる場合があります。
9.[Caching(キャッシュ作成)]タブを選択します。
10.[Advanced(詳細)]で、[Incremental Refresh Mode(インクリメンタル更新モード)]を選択して、オンデマンドで更新できるインクリメンタルキャッシュを有効にします。
インクリメンタル更新キャッシングでは、クライアントが更新を要求したときにクライアントバージョンのキャッシュのみが更新されます。
11.次のフィールドに値を指定します。
Initialize the cache using(キャッシュの初期化に使用するスクリプト) — Studioリソースツリーに存在し、出力パラメーターを1つ持つプロシージャまたはスクリプトを指定します。このスクリプトは、初期キャッシュを作成するために使用されます。
Refresh the cache using(キャッシュの更新に使用するスクリプト) — Studioリソースツリーに存在し、出力パラメーターを1つ持つプロシージャまたはスクリプトを指定します。出力パラメーターは、VARCHARデータタイプである必要があります。
12.キャッシュの設定を保存します。キャッシュ設定を保存すると、Studioリソースツリーにキャッシュされた各リソースが稲妻アイコンとともに表示されます。これはリソースがキャッシュされていることを示しています。
13.ビューとデータストレージタイプの間にデータ型の非互換性がある場合は、『TDV Reference Guide(TDVリファレンスガイド)』の「Cache Data Type Mapping(キャッシュデータ型のマッピング)」を参照してください。
プルベースのインクリメンタルキャッシュの初期化サンプルスクリプト
次のサンプルスクリプトは、キャッシュテーブルを作成するために使用されます。このスクリプトには、VARCHAR型のIncrementalMaintenanceLevel出力パラメーターが1つあります。
PROCEDURE InitalCache(OUT IncrementalMaintenanceLevel VARCHAR)
BEGIN
DECLARE cacheKey BIGINT;
DECLARE maxI BIGINT;
 
/* 1. Retrieve cache key from request environment */
CALL /lib/util/GetEnvironment('System.CACHED_RESOURCE_CACHE_KEY', cacheKey);
CALL /lib/debug/Log('cachedResourceCacheKey = ' || cacheKey);
 
/* 2. Determine initial snapshot level */
SELECT {option no_data_cache} MAX(i) INTO maxI FROM /shared/INCREMENTAL_CACHING/INCR_CACHE_TEST;
SET maxI = COALESCE(maxI, 0);
 
/* 3. Load cache target table */
INSERT INTO
/shared/INCREMENTAL_CACHING/incr_cache_test_target
SELECT {option disable_data_cache}
cacheKey, S.*
FROM
/shared/INCREMENTAL_CACHING/INCR_CACHE_TEST S
WHERE
i <= maxI;
 
/* 4. Return incremental maintenance level */
SET IncrementalMaintenanceLevel = CAST(maxI AS VARCHAR);
END
プルベースのインクリメンタルキャッシュの更新サンプルスクリプト
次のサンプルスクリプトは、キャッシュのローカルコピーをキャッシュテーブルの最新データで更新するよう要求するために使用されます。このスクリプトには、VARCHAR型のIncrementalMaintenanceLevel出力パラメーターが1つあります。
PROCEDURE DeltaLoader(OUT IncrementalMaintenanceLevel VARCHAR)
BEGIN
DECLARE cacheKey BIGINT;
DECLARE maxI BIGINT;
 
/* 1. Retrieve cache key from request environment */
CALL /lib/util/GetEnvironment('System.CACHED_RESOURCE_CACHE_KEY', cacheKey);
CALL /lib/debug/Log('cachedResourceCacheKey = ' || cacheKey);
 
/* 2. Retrieve incremental maintenance level from request environment */
CALL /lib/util/GetEnvironment('System.CACHED_RESOURCE_INCREMENTAL_MAINTENANCE_LEVEL', IncrementalMaintenanceLevel);
CALL /lib/debug/Log('cachedResourceIncrementalCacheMaintenanceLevel = ' || IncrementalMaintenanceLevel);
 
/* 3. Determine next level */
SELECT {option no_data_cache} MAX(i) INTO maxI FROM /shared/INCREMENTAL_CACHING/QA/"db-lab-9"/QAN/INCR_CACHE_TEST;
SET maxI = COALESCE(maxI, 0);
 
/* 4. Refresh cache target table */
INSERT INTO
/shared/INCREMENTAL_CACHING/QA/"db-lab-9"/QAN/incr_cache_test_target
SELECT {option disable_data_cache}
cacheKey, S.*
FROM
/shared/INCREMENTAL_CACHING/QA/"db-lab-9"/QAN/INCR_CACHE_TEST S
WHERE
i > CAST(IncrementalMaintenanceLevel AS BIGINT) AND i <= maxI;
 
/* 5. Update incremental maintenance level */
SET IncrementalMaintenanceLevel = CAST(maxI AS VARCHAR);
CALL /lib/debug/Log('IncrementalMaintenanceLevel for successful run of DeltaLoader script= ' || IncrementalMaintenanceLevel);
 
EXCEPTION
ELSE
--Log the exception
CALL /lib/debug/log('Exception raised in the delta loader script');
CALL /lib/debug/log('Exception is : ' || CURRENT_EXCEPTION.NAME || ': ' || CURRENT_EXCEPTION.MESSAGE);
 
--Don't advance the incremental maintenance level on a failure
CALL /lib/util/GetEnvironment('System.CACHED_RESOURCE_INCREMENTAL_MAINTENANCE_LEVEL', IncrementalMaintenanceLevel);
CALL /lib/debug/Log('IncrementalMaintenanceLevel after exception in DeltaLoader script= ' || IncrementalMaintenanceLevel);
 
END