2017.9.12
intra mart でメモリキャッシュを利用する場合の注意点をご紹介します。
メモリキャッシュは無駄なDBアクセスやファイルアクセスを無くし、メモリ上に保存するこで
パフォーマンスが大幅に上がるよく利用する手段かと思います。
そこでintra-martでは標準として「EHCache」というキャッシュモジュールが搭載されています。
■Cacheサービス
https://www.intra-mart.jp/download/product/iap/development/script_programming_guide/texts/application/cache/index.html
※スクリプト開発モデルのプログラミングガイドですが、Javaでも利用可能です。
しかし、注意として場所によっては利用できません。
例えば、SSOユーザコードプロバイダ等のログイン前に動作する箇所ではテナントIDが取得できないため、利用することができません。
■Javaコード例(SSOユーザコードプロバイダ内で実行)
import jp.co.intra_mart.foundation.cache.Cache; import jp.co.intra_mart.foundation.cache.CacheManager; import jp.co.intra_mart.foundation.cache.CacheManagerFactory; final CacheManager manager = CacheManagerFactory.getCacheManager(); final Cache<String, String> cache = manager.getCache(キャッシュ名);
すると、以下のエラーが発生します。
java.lang.IllegalStateException: [E.IWP.CACHE.00005] テナントが指定されていません。
どうやら内部ではテナント毎にEhcacheManagerが管理されているようです。
この場合、テナントIDを取得できないような場所では手立てはありませんので、
「EHCache」モジュールを純正のまま利用することも可能です。
※利用の際は十分な検証をお願いします。
■純正のEHCacheをインポートする
import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager;
■Javaコード例
final CacheManager manager = CacheManager.getInstance(); final Cache cache = manager.getCache(キャッシュ名);
純正のEHCacheを利用した場合は、ガイドに記載のim-ehcache-config配下に配置した設定ファイルは読み込まれません。
※IMのEHCacheと純正のEHCacheで微妙に設定可能な項目が異なる為、EHCacheのドキュメントを参照してください。
以下の様に設定ファイルを明示的に指定することも可能です。
final CacheManager cacheManager = CacheManager.newInstance(getClass().getResource(XMLファイルのパス));