8.7.2 キャッシュの参照形態とキャッシュタイプ
キャッシュの参照形態には次の3種類があります。
-
GCによる回収の対象になりません。
-
弱参照(java.lang.ref.WeakReference)
弱可到達の場合,GCによる回収の対象になります。なお,弱可到達かどうかは,java.lang.ref.WeakReferenceの仕様に依存します。
CJPAプロバイダで弱参照のキャッシュが回収対象にならない例を次に示します。
-
永続化コンテキストに登録されているエンティティオブジェクトのキャッシュ
-
弱可到達でないキャッシュにリレーションシップで参照されているキャッシュ
-
エンティティの継承戦略を使用している場合,継承関係にある別のエンティティオブジェクトのキャッシュが,弱可到達でないキャッシュ
-
-
ソフト参照(java.lang.ref.SoftReference)
メモリ残量の低下時にキャッシュアウトする参照形態です。
リソースの消費率や生存期間に応じて,GCによる回収の対象になります。回収されるタイミングや,回収対象となるオブジェクトの選択方法などの仕様は,JavaVMに依存します。
どの形態でキャッシュを参照するかによってキャッシュタイプの種類が異なります。キャッシュの参照形態とキャッシュタイプの対応を次の表に示します。
キャッシュの参照形態 |
キャッシュタイプ |
---|---|
強参照 |
Full |
強参照+弱参照※1 |
HardWeak |
弱参照+ソフト参照※1 |
SoftWeak |
弱参照 |
Weak |
なし※2 |
None |
CJPAプロバイダでは,キャッシュのタイプを選択できます。アプリケーションの設計や環境によってタイプを選択してください。キャッシュタイプは,persistence.xmlで指定します。persistence.xmlについては「12.2 persistence.xml」を参照してください。
次にキャッシュタイプについて説明します。
- 〈この項の構成〉
(1) Full
すべてのエンティティを強参照でキャッシュします。
キャッシュタイプにFullを指定した場合,データベースへのアクセスが少なくなるため,処理に対する負荷が少なくなります。ただし,メモリを占有し続けるため,メモリへの負荷が高くなります。
Fullは,エンティティオブジェクトの存続期間が長く,頻繁なアクセスを必要とする少数のエンティティオブジェクトで作成される場合に指定します。また,多数のエンティティオブジェクトを読み取る場合は,メモリの負荷が高くなるので,複数レコードを一括更新する場合の使用はお勧めしません。
Fullを指定した場合,指定されたキャッシュサイズで強参照領域を確保します。強参照領域が規定のサイズを超えた場合,Hashtableの仕様に基づいて領域を増やします。Fullを指定した場合のキャッシュ内のイメージを次の図に示します。
(2) HardWeak
強参照と弱参照でキャッシュします。
エンティティオブジェクトをリストで保持するときには,強参照を使用します。キャッシュサイズに指定した値だけ,強参照領域を固定長で作成します。キャッシュサイズが指定された値に達すると,古いエンティティオブジェクトを弱参照に移動します。このとき,キャッシュへの登録が最も長く使用されていないエンティティオブジェクトから順に弱参照に移動されます。弱参照に移動したエンティティオブジェクトが使用されると,再度,強参照の領域に格納されます。
HardWeakを指定すると,存続期間の長いエンティティオブジェクトを使用して,キャッシュで使用されるメモリを効率良く制御できます。
SoftWeakを使用したシステムでメモリ不足の状態が頻繁に発生する場合には,ソフト参照の利点を生かすことができないため,HardWeakを使用してください。HardWeakの場合のキャッシュ内イメージを次の図に示します。
HardWeakの場合,強参照のキャッシュ領域では強参照でキャッシュを保持します。また,弱参照のキャッシュ領域では弱参照でキャッシュを保持します。
(3) SoftWeak
ソフト参照と弱参照でキャッシュします。
ソフト参照を使用して,エンティティオブジェクトをリストで保持し,キャッシュサイズに指定した値だけ,ソフト参照領域を固定長で作成します。キャッシュサイズが指定された値に達すると,古いエンティティオブジェクトを弱参照の領域に移動します。このとき,キャッシュへの登録が最も長く使用されていないエンティティオブジェクトから順に弱参照に移動されます。弱参照に移動したエンティティオブジェクトが使用されると,再度,強参照の領域に格納されます。
SoftWeakを指定すると,存続期間の長いエンティティオブジェクトを使用して,キャッシュで使用されるメモリを効率良く制御できます。このため,キャッシュ機能を使用する場合は,SoftWeakを指定することをお勧めします。SoftWeakの場合のキャッシュ内イメージを次の図に示します。
SoftWeakの場合,ソフト参照のキャッシュ領域ではソフト参照でキャッシュを保持します。また,弱参照のキャッシュ領域では弱参照でキャッシュを保持します。