intra-mart Accel Platform スクリプト開発モデル プログラミングガイド 第16版 2020-04-01

Cacheサービス

Cacheとは

Cacheはアプリケーションサーバ上のメモリを利用して、オブジェクトの保存を行うことが可能な機能です。
データベースアクセスや、ファイルアクセス等の取得結果をキャッシュすることによりアプリケーションのパフォーマンス向上を図ることが可能となります。

仕様

標準では、Cache実装としてEHCacheが利用されます。
EHCacheに関しては、 http://ehcache.org を参照してください。

Cacheに登録したオブジェクトは、設定ファイルに指定した要素数、またはサイズの上限を超えた場合に破棄されます。
また、有効期間を過ぎたオブジェクトも破棄対象となります。
Cacheを利用する場合、そのCacheに対する設定は%CONTEXT_PATH%/WEB-INF/conf/im-ehcache-config/フォルダ配下に任意の名前のxmlファイルを配置する必要があります。
以下に設定ファイル例を示します。
<?xml version="1.0" encoding="UTF-8"?>
<im-ehcache-config xmlns="http://www.intra-mart.jp/cache/ehcache/config"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.intra-mart.jp/cache/ehcache/config im-ehcache-config.xsd ">

   <cache name="myCache"
         enable="true"
         max-bytes-memory="10m"
         max-elements-on-memory="100"
         overflow-to-disk="true"
         max-bytes-disk="50m"
         max-elements-on-disk="500"
         time-to-idle-seconds="600"
         time-to-live-seconds="3600" />

</im-ehcache-config>

注意

文字コードを UTF-8 にして保存してください。
各設定に関する詳細は以下の通りです。
属性名 説明
name Cache名を設定します。
enable trueまたはfalseを指定します。 falseが指定された場合は該当のCacheは無効となります。
max-btyes-memory メモリ上にオブジェクトを格納する際の最大サイズを指定します。 1k, 10M, 50G等の表記が可能です。
max-elements-on-memory メモリ上にキャッシュするオブジェクトの最大数を指定します。
overflow-to-disk メモリ上にキャッシュするの領域の上限を超えた場合にディスクに書き出すか設定します。
max-bytes-disk ディスク上にオブジェクトを格納する際の最大サイズを指定します。 1k, 10M, 50G等の表記が可能です。
max-elements-on-disk ディスク上にキャッシュするオブジェクトの最大数を指定します。
time-to-idle-seconds アイドル時間(秒)を指定します。指定された時間対象となるオブジェクトが参照されなかった場合、そのオブジェクトは破棄されます。
time-to-live-seconds 生存期間(秒)を指定します。指定された生存期間を超えた場合そのオブジェクトは破棄されます。

プログラミング方法

function getUsers() {
  // cacheインスタンスを生成します。引数'myCache'はim-ehcache-configに定義されているCache名を指定する必要があります。
  var cache = new Cache('myCache');
  // キャッシュから情報の取得を試みます。取得できた場合はその値を返却します。
  var users = cache.get('key');
  if(users != null){
    return users;
  }
  // キャッシュに情報が存在しなかったため、データベースから情報の取得を行います。
  var database = new TenantDatabase();
  var result = database.select('SELECT user_cd FROM b_m_account_b');
  // データベースから情報の取得に失敗した場合は空の配列を返却します。
  // 通常はログ出力、エラー情報の返却が必要となります。
  目的に合わせて適切に実装を行ってください。
  if(result.error){
    return [];
  }
  // 取得した情報をキャッシュに格納した後、返却します。
  users = [];
  for(var i = 0, length = result.data.length; i < length; i++){
    var record = result.data[i];
    users.push(record.user_cd);
  }
  // キャッシュに格納し、返却します。
  cache.put('key', users);
  return users;
}
データベースからデータを取得する際の例です

コラム

キャッシュの生存期間等はすべて設定ファイルに記述された内容に従います。
明示的にキャッシュの削除が必要となる場合はCache#removeまたはCache#removeAllを呼び出すことにより削除可能です。

コラム

「max-bytes-memory」及び、「max-bytes-disk」属性が設定されている場合、Cacheにオブジェクトを登録する際に、そのオブジェクトのサイズの計算処理が行われます。
この際、登録するオブジェクトが、別のオブジェクトの参照を大量に持つ場合、計算処理に時間がかかりパフォーマンスの低下の原因となる可能性があります。
登録するオブジェクトが1000以上の参照を持つ場合、下記のようなメッセージがログに出力されます。
The configured limit of 1,000 object references was reached while attempting to calculate the size of the object graph.
Severe performance degradation could occur if the sizing operation continues.
This can be avoided by setting the CacheManger or Cache <sizeOfPolicy> elements maxDepthExceededBehavior to "abort" or adding stop points with @IgnoreSizeOf annotations.
If performance degradation is NOT an issue at the configured limit, raise the limit value using the CacheManager or Cache <sizeOfPolicy> elements maxDepth attribute.
For more information, see the Ehcache configuration documentation.
このログが出力される場合は、キャッシュに格納するオブジェクトの構成を見直すか、「max-bytes-memory」または、「max-bytes-disk」の代わりに、「max-elements-on-memory」または「max-elements-on-disk」の利用を検討して下さい。