キャッシュ処理の詳細

最終更新日: 2024年3月18日
R8 | R9

キャッシュについて

Wagbyはデータベースから読み込んだ値をメモリ内にキャッシュしています。これによりシステム全体のパフォーマンスを向上させています。

モデルごとにキャッシュを使うかどうかを指定する

モデルごとにキャッシュを有効にするかどうかを指定することができます。 ただし、ワークフローを有効にしたモデルは "データベースのキャッシュを完全に無効にする" をチェックすることはできません。

サイズの設定

アプリケーション全体のキャッシュサイズを指定することができます。

モデルごとにキャッシュサイズを指定することはできません。

一時ファイル

wagbyapp/temp フォルダに一時ファイルが生成されることがあります。Wagbyアプリケーション停止後であれば、wagbyapp/temp フォルダに残った一時ファイルを手動で削除することができます。

キャッシュの種類と性質

キャッシュは「ストアモデル」と「選択肢」があります。

区分説明Time To LiveTime To Idle
ストアモデル データベースから読み込んだ1データ。Wagby内部では「エンティティサービス」を使って取得する。 600 sec
(10分)
600 sec
(10分)
選択肢 登録、更新、詳細、一覧画面のモデル参照項目で表示される「内容」部の文字列。 無制限 259,200 sec
(72時間)
TTL (Time To Live) はキャッシュに登録されたデータがどのくらいキャッシュに残るかという生存期間です。実際にキャッシュされた値が使われたかどうかに関わらず、指定された期間はキャッシュに存在します。期間を過ぎるとキャッシュから削除されます。

TTI (Time To Idle) は最後にキャッシュされた値が使われてから、一定期間過ぎたところで破棄される時間です。TTI で指定された時間内にキャッシュ値が使われると、キャッシュは残り続けます。

いずれも設定ファイル WEB-INF/classes/ehcache.xml で制御します。

1リクエスト間のキャッシュ

キャッシュを無効にした場合でも、1リクエスト間(WebブラウザとWebサーバ間の通信のやりとり)で発生したデータベースとのやりとりはメモリにキャッシュされます。レスポンスを返した段階で、このキャッシュは自動的に消去されます。キャッシュ有効期間は非常に短いですが、若干のパフォーマンス改善につながります。

この「1リクエスト間のキャッシュ」を無効にすることもできます。この場合、常にデータベースから値を読み込むようになります。

定義方法

「画面 > その他 > データベースの詳細」で「キャッシュを有効にする」のチェックをはずしたとき、さらに「Javaソースコードの設定」にある「データベースのキャッシュを完全に無効にする」をチェックします。(標準ではチェックされていないため、1リクエスト間のキャッシュは有効となっています。)

図2 データベースのキャッシュを完全に無効にする

よくある質問と回答

キャッシュライブラリは何を使っていますか。

オープンソースの ehcache ライブラリ (2系) を使っています。

キャッシュが満杯になったとき、どのような方針でキャッシュに残るデータが決まりますか。

LRU アルゴリズムを採用しています。よく使われるデータを優先してキャッシュします。

誰かが操作中にキャッシュクリア処理を行なっても問題ありませんか。

問題ありません。キャッシュに存在しないデータは、データベースから読み込まれます。

誰かが操作中にデータベースの値を直接、更新(または削除)するとキャッシュはどうなりますか。

Wagbyを通さずに直接、データベースの値が変更されても Wagby はこれを検知できません。そのため古い情報がキャッシュとして残ります。運用上、データベースの値と画面上の値が異なることになります。

データベースの値を変更するような運用を想定している場合は、そのモデルのキャッシュを無効としてください。パフォーマンスに影響しますが、不正確な値が画面に表示される問題が解消されます。

Wagbyではジョブ実行時にキャッシュをクリアする指定を行うことができます。または REST API を利用してキャッシュクリアを指示することもできます。

キャッシュに関する設定はどこで行われていますか。

wagbyapp/webapps/$(プロジェクト識別子)/WEB-INF/classes/ehcache.xml というファイルです。設定ファイルの記述ルールはehcacheのドキュメントをお読みください。

標準のキャッシュ設定を教えてください。

標準で用意される ehcache.xml は次のとおりです。

<ehcache updateCheck="false"
         maxBytesLocalHeap="100M">
  <defaultCache
      eternal="false"
      timeToIdleSeconds="600"
      timeToLiveSeconds="600"
      memoryStoreEvictionPolicy="LRU">
    <persistence strategy="none"/>
  </defaultCache>
  <cache name="__jfc_updateChoiceObjCache"
      eternal="false"
      timeToIdleSeconds="259200"
      timeToLiveSeconds="0"
      memoryStoreEvictionPolicy="LRU">
    <persistence strategy="none"/>
  </cache>
</ehcache>
  • キャッシュ対象となるのは Wagby のストアモデル(データベースから取得した値)と、リストボックス、ラジオボタン、チェックボックスのような選択肢情報です。
  • キャッシュサイズは全体で100Mbytesとしています。
  • キャッシュが満杯になった場合はLRUアルゴリズムにより、もっとも使われていないデータをキャッシュから除くようにしています。
  • 選択肢情報は "__jfc_updateChoiceObjCache" という別のキャッシュ領域を使います。

トラブルシューティング

You've assigned more memory to the on-heap than the VM can sustain

JVMヒープメモリ領域に空きが少なく、キャッシュ用のメモリ領域を確保できない場合に "CacheManager configuration: You've assigned more memory to the on-heap than the VM can sustain, please adjust your -Xmx setting accordingly" というエラーメッセージがコンソールに表示されます。この場合はヒープメモリ領域を増やすか、キャッシュ用のメモリ領域を減らしてください。

標準ではキャッシュ用メモリ領域に100Mbyteが割り当てられています。この数値は設定ファイル ehcache.xml の ehcache/@maxBytesLocalHeap 属性で指定しています。

The configured limit of 1,000 object references was reached while attempting to calculate the size of the object graph.

キャッシュしようとしているストアモデルが内部に多くの繰り返し項目、繰り返しコンテナ項目、チェックボックス項目を保持している場合、"[WARN net.sf.ehcache.pool.sizeof.ObjectGraphWalker checkMaxDepth] 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." という警告メッセージがコンソールに表示される場合があります。

これはキャッシュしようとしているストアモデルのサイズに関する計算を途中で停止したという(ehcacheの)内部処理を伝えるもので、動作に影響はありません。

回避策

sizeOfPolicyを設定する

ehcache.xmlにsizeOfPolicy設定を追加します。例えば次の設定を含めます。
<sizeOfPolicy maxDepth="100" maxDepthExceededBehavior="abort"/>

この設定はサイズ計算の深さの最大値を明示するとともに、この最大値を超える場合はサイズ計算を中止するようにしています。

この影響で、キャッシュ用メモリ領域(標準では100Mbyte)を上振れする可能性が生じます。ただしストアモデルのキャッシュのTTL(キャッシュの生存期間)により、一時的に上限値を超えたとしてもサイズの大きなオブジェクトも10分で消去されるため、これによってメモリが圧迫され全体の処理に影響を及ぼすことにはならないと考えられます。

maxEntriesLocalHeapを設定する

maxBytesLocalHeap指定に変わり、maxEntriesLocalHeap属性でキャッシュサイズを指定するようにすることで、このサイズ計算処理を行わないようにすることができます。maxEntriesLocalHeapはキャッシュに保持するストアモデルの上限数を指定します。(例 maxEntriesLocalHeap="10000")

注意

キャッシュ対象となるストアモデルのメモリ内のサイズが大きい場合、指定した数だけキャッシュすることでヒープ領域をより多く消費するようになります。ヒープ領域の空き状況を監視し、ヒープ領域が少ない場合はメモリを増やすなどの対策も行うようにしてください。

関連するページ