プル・ベースのインクリメンタル キャッシュの設定

プル・ベースのインクリメンタル キャッシングは、TDV キャッシング メカニズムと 2 つのスクリプトを使用して設定できます。プル・ベースのインクリメンタル キャッシングでは、ユーザーまたはクライアント アプリケーションは、キャッシュのコピーを集中管理されるキャッシュコピーと同期するように要求する必要があります。キャッシュの作成と更新に使用されるスクリプトはユーザーが定義するため、状況に応じてスクリプトを複雑なものにすることも、シンプルなものにすることもできます。スクリプトは、SQL またはカスタム Java プロシージャを使用して定義できます。プロシージャには、変更された行を識別するロジックが必要です。

このトピックでは、プル・ベースの方法でインクリメンタル キャッシングを定義するために必要なスクリプトを作成するための一般的なステップについて説明し、次のサンプル スクリプトを提供します。

プル・ベースのインクリメンタル キャッシュ初期化サンプル スクリプト
プル・ベースのインクリメンタル キャッシュ更新サンプル スクリプト

プル・ベースのインクリメンタル キャッシングを設定するには

1. データ ソース内で信頼できる一意の識別子を検索または作成します。これを使用して、最後のキャッシュ更新以降にデータがどのように変更されたかを判断できます。この一意の識別子は、システム変更番号、ログ シーケンス番号 (LSN)、または TIMESTAMP です。通常、cachekey カラムを使用して、どのデータが更新されたかを判別できます。
2. Java プロシージャ」または「カスタム Java プロシージャの追加、ページ 163」のプロシージャを使用して、新しい SQL スクリプトまたは Java プロシージャを作成します。

既存の SQL スクリプトまたはプロシージャを使用するには、Studio リソース ツリー内で目的のスクリプトまたはプロシージャを見つけます。

3. キャッシュのスクリプトまたはプロシージャに VARCHAR 出力パラメーターが 1 つあることを確認してください。
4. Studio の <localhost>/lib/util の下で使用する次の TDV API 呼び出しを評価します。
GetEnvironment-1 つ以上のシステム プロパティをプル・ベースのインクリメンタル キャッシュ SQL スクリプトに返すために使用できます。
GetProperty-1 つ以上のシステム プロパティをプル・ベースのインクリメンタル キャッシュ カスタム Java プロシージャに返すために使用できます。具体的には、サーバー 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 () が呼び出され、新しい cachekey 値が生成されます。
LoadResourceCacheStatus () が呼び出され、進行中のリフレッシュをサーバーに通知します。
LoadResourceCacheStatus () が呼び出されて、新しくアクティブになったデータがサーバーに通知されます。
TestDataSourceConnection は、データ ソースの接続が動作しているかどうかをテストするために使用されます。
ClearResourceCache (path, type) は、リソースのキャッシュをクリアするために使用されます。
UpdateResourceCacheKeyStatus (path, type, cacheKey, status, startTime, message) は、指定されたリソースのキャッシュ キーを更新するために使用されます。
GetResourceCacheStatusProcedure は、CreateResourceCacheKey および UpdateResourceCacheKeyStatus と共に使用され、外部キャッシュのローディングをサポートします。指定されたキャッシュ キーのキャッシュ ステータス情報を返します。
6. 次のロジックを使用して、キャッシュ ロジックを制御することを検討してください。
現在アクティブな cachekey を見つけるために、ステータス テーブルが照会されます。cachekey は、サーバー ID、リソース パス、およびステータス カラムの値が「A」の行にあります。INSERT、UPDATE、および DELETE オペレーションは、cachekey をフィルターとして使用してデータ テーブルに対して実行し、他のキーの更新を回避できます。
INSERT およびその他のオペレーションを実行して、必要に応じて記憶域テーブルに新しい行を作成し、そのようなすべての行に新しい cachekey 値があることを確認します。これは、完了時にコミットできるように、独立したトランザクションで実行する必要があります。
サーバー ID、リソース パス、cachekey、ステータスを「I」に設定し、starttime を現在の時刻に設定してステータス テーブルに対して INSERT を実行し、進行中の更新を示します。これは、すぐにコミットできるように、独立したトランザクションで実行する必要があります。
ステータスが「A」のサーバー ID とリソース パスを持つステータス テーブルのすべての行をステータス「C」に更新します。これにより、クリアする前のアクティブなキャッシュ データがマークされます。次に、serverID、リソース パス、およびキャッシュ キーを使用してステータス テーブルの行を UPDATE し、ステータスを「A」に設定し、finishtime を現在の時刻に設定します。これは、このキャッシュ キーが新しいアクティブなキーであることを示します。これは、すぐにコミットできるように、独立したトランザクションで実行する必要があります。
7. スクリプトまたはプロシージャを保存します。
8. Studio で、プル・ベースのインクリメンタル キャッシュを定義するキャッシュが有効になっているビューまたはプロシージャを開きます。

注:キャッシュオブジェクトが最新バージョンの TDV より前に作成された場合は、それらの再作成が必要になる場合があります。

9. [キャッシュ] タブを選択します。
10. [アドバンス] の下で、[インクリンタル リフレッシュ モード] を選択して、必要に応じて更新できるインクリメンタル キャッシュを有効にします。

インクリメンタル リフレッシュ キャッシュは、クライアントが更新を要求したときにのみクライアント バージョンのキャッシュを更新します。

11. 次のフィールドに値を指定します。
次を使用してキャッシュを初期化 - Studio リソース ツリーに存在し、1 つの出力パラメーターを持つプロシージャまたはスクリプトを指定します。このスクリプトは、初期キャッシュの作成に使用されます。
次を使用してキャッシュを更新 - Studio リソース ツリーに存在し、1 つの出力パラメーターを持つプロシージャまたはスクリプトを指定します。出力パラメーターは VARCHAR データ タイプである必要があります。
12. キャッシュ設定を保存します。キャッシュ設定が保存されると、キャッシュされた各リソースが Studio リソース ツリーに稲妻のアイコンとともに表示され、リソースがキャッシュされていることが示されます。
13. ビューとデータ ストレージ タイプの間にデータ タイプの非互換性がある場合は、『TDV リファレンス ガイド』の「キャッシュ データ タイプ マッピング」を参照してください。

プル・ベースのインクリメンタル キャッシュ初期化サンプル スクリプト

次のサンプル スクリプトは、キャッシュ テーブルを作成するために使用されます。このスクリプトには、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