永続性ユニットはEntityクラスごとに共有キャッシュを管理しています。このキャッシュはすべての永続性コンテキストから参照できます。
このキャッシュのライフサイクルは永続性ユニットと同じなので、エンティティマネージャファクトリの作成からクローズまで使用されます。
以下に永続性ユニットの共有キャッシュの特徴を説明します。
共有キャッシュの参照タイミング
共有キャッシュの参照タイミングについては、「5.9.1 永続性コンテキストキャッシュ」を参照してください。
共有キャッシュの更新タイミング
永続性コンテキストをクローズする時、キャッシュ内のEntityインスタンスがコピーされ、共有キャッシュにマージされます。
以下に永続性コンテキストキャッシュと共有キャッシュの関係図と検索順番を示します。
クライアントからの要求により検索メソッドが実行される場合、まずは永続性コンテキストキャッシュから検索します。
永続性コンテキストキャッシュにある場合、そのEntityインスタンスを返却します。ない場合は共有キャッシュを検索します。
共有キャッシュにある場合、そのEntityインスタンスのコピーを作成してコピーを永続性コンテキストキャッシュに格納し、アプリケーションに返却します。共有キャッシュにもない場合、データベースへ問い合わせします。
データ更新の場合は、共有キャッシュ内のデータとデータベースのデータの整合性を保つために、キャッシュ機能を行のロック機能と合わせて使用してください。行のロック機能については、「Java EE運用ガイド」-「行のロック機能」を参照してください。
共有キャッシュの解放タイミング
共有キャッシュ内に格納されているEntityインスタンスはエンティティマネージャファクトリがクローズされるタイミングで解放されます。コンテナ管理のエンティティマネージャを使用した場合、アプリケーションの停止時にエンティティマネージャファクトリがクローズされます。チューニング設定により、Entityインスタンスがガーベッジコレクション(以降、GC)により破棄されます。
以下に、共有キャッシュに格納されるEntityインスタンスがGC対象になるタイミングを制御するオプションを説明します。
この永続性ユニットプロパティをdeployment descriptor (persistence.xml)またはjavax.persistence.PersistenceのcreateEntityManagerFactory(String, Map)メソッドに指定してください。
プロパティ名 | 値 (太字:省略値) | 説明 |
---|---|---|
toplink.cache.type.<ENTITY> |
| 特定のEntityに対応する共有キャッシュのタイプ |
toplink.cache.type.default | その他のEntityの共有キャッシュのタイプ | |
toplink.cache.size.<ENTITY> | 0~MAX_INTEGER | 特定のEntityに対応する共有キャッシュタイプによるサイズ |
toplink.cache.size.default | その他のEntityの共有キャッシュタイプによるサイズ | |
toplink.cache.shared.<ENTITY> |
| 特定のEntityに対応する共有キャッシュを有効・無効にする |
toplink.cache.shared.default | その他のEntityの共有キャッシュを有効・無効にする |
値は大文字と小文字を区別します。
プロパティの<ENTITY>にEntity名またはパッケージ名を含むEntityクラス名を記載します。定義しないEntityにはdefaultを記載したプロパティの設定、または省略値が使用されます。
フィールドの更新を行わずにテーブルからいつも最新の情報を取得したい場合は共有キャッシュを無効にしますが、一般的には共有キャッシュを無効にする必要はありません。
特定のEntityに対応する共有キャッシュを無効にした場合、データの一貫性を保つためにそのEntityとrelationshipが持つEntityの共有キャッシュも無効にしてください。
各共有キャッシュタイプについて以下に説明します。
キャッシュタイプ | 意味 | 推奨条件 |
---|---|---|
Full | Entityは削除されない限りメモリからフラッシュされません。指定したキャッシュサイズは初期サイズとして使用され、上限サイズの設定はありません。 | データが少なく、メモリが多い場合に使用します。 |
Weak | 弱い参照(java.lang.ref.WeakReference)でEntityインスタンスを参照することにより、Fullよりメモリ使用量が少なくなります。指定したキャッシュサイズは初期サイズとして使用され、上限サイズの設定はありません。 | Java VM上でオブジェクトの参照がなくなるとEntityインスタンスがGCにより破棄される可能性があるため、開始したトランザクションがサーバ側で継続される場合だけ使用します。 |
HardWeak | Weakに似ていますが、ハード参照を参照するサブキャッシュも持っています。サブキャッシュサイズを超えると使用頻度が低いEntityインスタンスがサブキャッシュから弱い参照を使用しているキャッシュに移動されます。 | ハード参照されるEntityインスタンスが破棄されないため、キャッシュするインスタンスの最大数をトランザクション中に参照するEntityインスタンスの最大数と同じに設定してください。 |
SoftWeak | HardWeakとほぼ同じですが、サブキャッシュにソフト参照(java.lang.ref.SoftReference)を使用しています。指定したキャッシュサイズはサブキャッシュに格納するEntityインスタンスの最大数です。 | 通常の環境でこのタイプを使用します。 |
例
共有キャッシュタイプの定義例
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <persistence-unit name="com.company.my.pu"> <jta-data-source>jdbc/myDatasource</jta-data-source> <properties> <property name="toplink.cache.type.CountryCode" value="Full"/> <property name="toplink.cache.size.CountryCode" value="100"/> <property name="toplink.cache.shared.StockQuote" value="false"/> <property name="toplink.cache.size.default" value="200"/> </properties> </persistence-unit> </persistence>