キャッシュ処理の詳細
最終更新日: 2024年3月18日
R8 | R9
Wagbyはデータベースから読み込んだ値をメモリ内にキャッシュしています。これによりシステム全体のパフォーマンスを向上させています。
モデルごとにキャッシュを有効にするかどうかを指定することができます。 ただし、ワークフローを有効にしたモデルは "データベースのキャッシュを完全に無効にする" をチェックすることはできません。
アプリケーション全体のキャッシュサイズを指定することができます。
モデルごとにキャッシュサイズを指定することはできません。
wagbyapp/temp フォルダに一時ファイルが生成されることがあります。Wagbyアプリケーション停止後であれば、wagbyapp/temp フォルダに残った一時ファイルを手動で削除することができます。
キャッシュは「ストアモデル」と「選択肢」があります。
キャッシュを無効にした場合でも、1リクエスト間(WebブラウザとWebサーバ間の通信のやりとり)で発生したデータベースとのやりとりはメモリにキャッシュされます。レスポンスを返した段階で、このキャッシュは自動的に消去されます。キャッシュ有効期間は非常に短いですが、若干のパフォーマンス改善につながります。
この「1リクエスト間のキャッシュ」を無効にすることもできます。この場合、常にデータベースから値を読み込むようになります。
「画面 > その他 > データベースの詳細」で「キャッシュを有効にする」のチェックをはずしたとき、さらに「Javaソースコードの設定」にある「データベースのキャッシュを完全に無効にする」をチェックします。(標準ではチェックされていないため、1リクエスト間のキャッシュは有効となっています。)
オープンソースの ehcache ライブラリ (2系) を使っています。
LRU アルゴリズムを採用しています。よく使われるデータを優先してキャッシュします。
問題ありません。キャッシュに存在しないデータは、データベースから読み込まれます。
Wagbyを通さずに直接、データベースの値が変更されても Wagby はこれを検知できません。そのため古い情報がキャッシュとして残ります。運用上、データベースの値と画面上の値が異なることになります。
データベースの値を変更するような運用を想定している場合は、そのモデルのキャッシュを無効としてください。パフォーマンスに影響しますが、不正確な値が画面に表示される問題が解消されます。
Wagbyではジョブ実行時にキャッシュをクリアする指定を行うことができます。または REST API を利用してキャッシュクリアを指示することもできます。
wagbyapp/webapps/$(プロジェクト識別子)/WEB-INF/classes/ehcache.xml というファイルです。設定ファイルの記述ルールはehcacheのドキュメントをお読みください。
標準で用意される ehcache.xml は次のとおりです。
JVMヒープメモリ領域に空きが少なく、キャッシュ用のメモリ領域を確保できない場合に "CacheManager configuration: You've assigned more memory to the on-heap than the VM can sustain, please adjust your -Xmx setting accordingly" というエラーメッセージがコンソールに表示されます。この場合はヒープメモリ領域を増やすか、キャッシュ用のメモリ領域を減らしてください。
キャッシュしようとしているストアモデルが内部に多くの繰り返し項目、繰り返しコンテナ項目、チェックボックス項目を保持している場合、"[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の)内部処理を伝えるもので、動作に影響はありません。
ehcache.xmlにsizeOfPolicy設定を追加します。例えば次の設定を含めます。
この設定はサイズ計算の深さの最大値を明示するとともに、この最大値を超える場合はサイズ計算を中止するようにしています。
この影響で、キャッシュ用メモリ領域(標準では100Mbyte)を上振れする可能性が生じます。ただしストアモデルのキャッシュのTTL(キャッシュの生存期間)により、一時的に上限値を超えたとしてもサイズの大きなオブジェクトも10分で消去されるため、これによってメモリが圧迫され全体の処理に影響を及ぼすことにはならないと考えられます。
maxBytesLocalHeap指定に変わり、maxEntriesLocalHeap属性でキャッシュサイズを指定するようにすることで、このサイズ計算処理を行わないようにすることができます。maxEntriesLocalHeapはキャッシュに保持するストアモデルの上限数を指定します。(例 maxEntriesLocalHeap="10000")
キャッシュ対象となるストアモデルのメモリ内のサイズが大きい場合、指定した数だけキャッシュすることでヒープ領域をより多く消費するようになります。ヒープ領域の空き状況を監視し、ヒープ領域が少ない場合はメモリを増やすなどの対策も行うようにしてください。
キャッシュについて
モデルごとにキャッシュを使うかどうかを指定する
サイズの設定
一時ファイル
キャッシュの種類と性質
区分 説明 Time To Live Time To Idle
ストアモデル
データベースから読み込んだ1データ。Wagby内部では「エンティティサービス」を使って取得する。
600 sec
(10分)600 sec
(10分)
選択肢
登録、更新、詳細、一覧画面のモデル参照項目で表示される「内容」部の文字列。
無制限
259,200 sec
(72時間)
TTI (Time To Idle) は最後にキャッシュされた値が使われてから、一定期間過ぎたところで破棄される時間です。TTI で指定された時間内にキャッシュ値が使われると、キャッシュは残り続けます。
いずれも設定ファイル WEB-INF/classes/ehcache.xml で制御します。
1リクエスト間のキャッシュ
定義方法
よくある質問と回答
キャッシュライブラリは何を使っていますか。
キャッシュが満杯になったとき、どのような方針でキャッシュに残るデータが決まりますか。
誰かが操作中にキャッシュクリア処理を行なっても問題ありませんか。
誰かが操作中にデータベースの値を直接、更新(または削除)するとキャッシュはどうなりますか。
キャッシュに関する設定はどこで行われていますか。
標準のキャッシュ設定を教えてください。
<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>
トラブルシューティング
You've assigned more memory to the on-heap than the VM can sustain
The configured limit of 1,000 object references was reached while attempting to calculate the size of the object graph.
回避策
sizeOfPolicyを設定する
<sizeOfPolicy maxDepth="100" maxDepthExceededBehavior="abort"/>
maxEntriesLocalHeapを設定する
注意
関連するページ