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

プルベースのインクリメンタルキャッシングは、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. 次のロジックを使用して、キャッシュ ロジックを制御することを検討してください。
現在アクティブなキャッシュキーを見つけるために、ステータス テーブルが照会されます。キャッシュキーは、サーバー ID、リソース パス、およびステータスカラムの値が「A」の行にあります。 INSERT、UPDATE、および DELETE 操作は、cachekey をフィルターとして使用してデータ テーブルに対して実行し、他のキーの更新を回避できます。
INSERT およびその他の操作を実行して、必要に応じて記憶域テーブルに新しい行を作成し、そのようなすべての行に新しい cachekey 値があることを確認します。これは、完了時にコミットできるように、独立したトランザクションで実行する必要があります。
サーバー ID、リソース パス、キャッシュキー、ステータスを「I」に設定し、starttime を現在の時刻に設定してステータス テーブルに対して INSERT を実行し、進行中の更新を示します。これは、すぐにコミットできるように、独立したトランザクションで実行する必要があります。
ステータスが「A」のサーバー ID とリソース パスを持つステータス テーブルのすべての行をステータス「C」に更新します。これにより、クリアする前のアクティブなキャッシュ データがマークされます。次に、serverID、リソース パス、およびキャッシュ キーを使用してステータス テーブルの行を UPDATE し、ステータスを「A」に設定し、finishtime を現在の時刻に設定します。これは、このキャッシュ キーが新しいアクティブなキーであることを示します。これは、すぐにコミットできるように、独立したトランザクションで実行する必要があります。
7. スクリプトまたはプロシージャを保存します。
8. Studio で、プルベースのインクリメンタル キャッシュを定義するキャッシュが有効になっているビューまたはプロシージャを開きます。

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

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

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

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