キャッシュ

Q
importで読み込んだCRSのキャッシュが削除されない
[内容]
importで読み込んだCRSのキャッシュが、DeleteCacheを実行しても削除されず、
最新の状態が反映されない

A
[原因]
importステートメントによるPackageのロードは、指定したURLのファイル名に一致する
Packageが既にメモリ上にロードされている場合、Packageを再ロードせず既に
ロードされているPacakgeが有効となります。
また、メモリ上にロードされているPackageの内容はDeleteCacheにより削除されません。
よって、Packageに変更があった場合、DeleteCache前にキャッシュからimportした
旧い内容がメモリ上にロードされ、DeleteCache後も旧い処理が実行されることになり、
Packageの変更が反映されない、といった動きになります。


以下の例で global.crsに変更があった場合、DeleteCacheより前に global.crsのimportが
処理されるため、旧いキャッシュの内容がメモリ上にロードされた状態となります。
メモリ上にロードされている内容はDeleteCacheで削除されないため、global.crsの変更は
反映されず、旧い処理のまま実行されます。

★のタイミングでは、Packageの内容が既にメモリ上にロードされているため、再ロードを
行いません。

例)
■menu.crs (最初に処理するCRS)
import "global.crs";
 ↑
 CRSがキャッシュから読み込まれ、メモリ上にロードされる。

/* バージョンチェック */
String curVersion = "1.0.0.2";
Get( "version.crs" );
 ↑
 キャッシュから読み込まれる。

if( curVersion != version ) {
    //.DeleteCache(); ・・・・(A)
    Get( "version.crs" );
  ↑
  改めてサーバから version.crsが読み込まれる。 ・・・・(B)
}
Get( "Form1.crs" );

■Form1.crs
import "global.crs"; ・・・・
 ↑
 既にメモリ上にロードされているため、(A)のDeleteCacheで全キャッシュを
 削除しても、(B)の version.crsのようにサーバから読み込まれません。
 メモリ上にロードされた Packageの内容で処理が実行されます。

Form Form1{
 :
 :
}


[解決方法]
importステートメントは、ファイルの先頭以外でも記述可能ですので、キャッシュの
更新チェックの後(DeleteCacheの実行後)にimportし、最新のPacakgeをロード
するようにします。

/* バージョンチェック */
String curVersion = "1.0.0.2";
Get( "version.crs" );

if( curVersion != version ) {
    //.DeleteCache();
    Get( "version.crs" );
}
import "global.crs";
 ↑
 DeleteCacheの処理の後に読み込む

Get( "Form1.crs" );

管理番号:Cac_006
  Biz-Collections Bizの宝箱 トップへ
  Biz/Browser・Biz/Designer TIPS集 トップへ