Cosminexus V9 アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)
ここでは,エンティティオブジェクトのキャッシュ機能を使用するときの注意事項を説明します。
アプリケーション内でJPQLやネイティブクエリを使用して,データを更新したり,削除したりした場合,キャッシュの内容は更新されません。refresh操作などを行って,データベースの内容を取得し直してください。
次に示す操作の場合,キャッシュのデータを読み込むため,データベースへの更新がされません。
キャッシュを使用することで,データベースへのアクセス頻度を下げることができます。ただし,一方でキャッシュによるデータのタイムラグが発生して,楽観的ロック例外の発生頻度が高くなるおそれもあります。
キャッシュは永続化コンテキスト単位に存在します。そのため,永続化コンテキストと対で存在するEntityManagerが複数かつ同時期に生成され,同一プライマリキーのエンティティを同時に操作すると,一方でデータを更新しても他方でタイミング良く,更新後のデータを参照できないことがあります。これによって,楽観的ロック例外が発生しやすくなります。
次に,楽観的ロック例外が発生する仕組みと対処方法について説明します。
ここでは,次の図に示す環境で,永続化コンテキスト単位にキャッシュが存在する場合を例に説明します。
図6-19 この例で説明する環境
図の状態では,キャッシュとデータベースには不整合はなく,すでにキャッシュにAというデータが格納されているものとします。
図6-20 永続化コンテキスト1でのデータの変更
図6-21 永続化コンテキスト2でのデータの変更
このような環境の場合,キャッシュを使用すると,更新されないキャッシュが残ってしまい,楽観的ロックによる例外が発生することがあります。
楽観的ロック例外が発生した場合は,キャッシュ内の該当オブジェクトは削除されます。このため,findメソッドを実行するか,またはrefreshメソッドを実行して関連するすべてのデータを再度データベースから取得してください。これによって,キャッシュのデータとデータベースを同期できます。
All Rights Reserved. Copyright (C) 2012, 2015, Hitachi, Ltd.