この章では、TopLink Gridをバイト・コード・ウィービングおよび遅延ロードとともに使用する方法の推奨事項を示します。
バイト・コード・ウィービングは、コンパイル済Javaクラスのバイト・コードを変更する手法です。バイト・コード・ウィービングを構成して、1対1および多対1関係の遅延ロードのサポート、属性レベルの変更追跡、フェッチ・グループなど、いくつかのEclipseLink JPAパフォーマンス最適化を有効にできます。
ウィービングは、エンティティ・クラスのロード時に動的に実行するか、ビルド・プロセスの一部として静的に実行できます。静的バイト・コード・ウィービングは、EclipseLinkで提供されるweaver
タスクを使用してAntビルドに組み込むことができます。
動的バイト・コード・ウィービングは、Oracle WebLogicなどのJava EE 5対応アプリケーション・サーバーで自動的に有効になります。ただし、Java SEでは、JRE 1.5 javaagent
JVMコマンドライン引数を使用して明示的に有効にする必要があります。JRE 1.5.の動的バイト・コード・ウィービングの詳細は、次のURLでEclipseLinkエージェントを使用してJPAエンティティの動的ウィービングを構成する方法に関する項を参照してください。
Coherenceキャッシュ・サーバーでバイト・コード・ウィービングを有効にするには、-javaagent:<
PATH
>\eclipselink.jar
でJava VMを起動する必要があります。Java SEクライアント・アプリケーションは、-javaagent
引数を指定して実行する必要があります。
静的および動的バイト・コード・ウィービングの構成と無効化の詳細は、EclipsepediaのEclipseLink JPAウィービングの使用に関する項を参照してください。
http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_(ELUG)#Using_EclipseLink_JPA_Weaving
遅延ロードは、必要になるまでデータベースへのオブジェクトの問合せを遅延するために使用する手法です。これにより、アプリケーションによってロードされるデータ量を削減し、スループットを向上できます。TopLink Grid JPAまたはネイティブORMアプリケーションでは、すべての関係を遅延ロードする必要があります。JPAの1対多および多対多関係では遅延ロードがデフォルトですが、1対1および多対1関係では即時です。これらの関係タイプでは、遅延ロードを明示的に選択する必要があります。たとえば、関係注釈の多くでは遅延ロードを属性として指定できます。
... @ManyToOne(fetch=FetchType.LAZY) private Publisher parent ...
効率を最大化するために、TopLink GridがCoherenceキャッシュに格納するすべての1対1および多対1エンティティ関係に遅延ロードを指定する必要があります。遅延ロードは、EclipseLinkのバイト・コード・ウィービングを通じて実装され、Java EE 5準拠アプリケーション・サーバーで実行されていない場合は明示的に有効にする必要があります。詳細は、「バイト・コード・ウィービングでのコンパイル済Javaクラスの変更」を参照してください。
ニア・キャッシュは、Oracle Coherenceによって提供される標準キャッシュ構成の1つです。ニア・キャッシュを使用すると、オブジェクトを繰り返し取得する場合にネットワーク・アクセスを回避することでスループットを向上することができます。たとえば、ユーザーが特定のWebサーバーに固定されている環境では、ニア・キャッシュによりパフォーマンスが向上する可能性があります。
ニア・キャッシュはハイブリッド・キャッシュであり、サイズの制限された高速なデータ・アクセスを提供するフロント・キャッシュと、スケーラブルで要求に応じてロード可能であり、フェイルオーバー保護を提供する容量の大きいバック・キャッシュで構成されます。
Toplink Gridを使用するアプリケーションの場合、Oracle Coherenceを使用する他のアプリケーションと同じ方法でニア・キャッシュを構成します。ニア・キャッシュの詳細は、Oracle Coherence開発者ガイドのニア・キャッシュとニア・キャッシュ・スキームの定義に関する項を参照してください。
注意: ニア・キャッシュは、Coherenceキャッシュのget 操作においてのみ使用され、Filter 操作の実行時には使用されません。これは、Filter 操作は各メンバーに送信され、各メンバーが結果をコール元に直接返すためです。この場合、ニア・キャッシュに値は追加されません。
これは、JPQL問合せを使用している場合に問題となることもあります。TopLink Gridのグリッド読取りまたはグリッド・エンティティ構成では、JPQL問合せは |
TopLink GridをCoherenceキャッシュおよびCoherence*Webを使用するアプリケーションとともに使用する場合、エンティティに対するTopLink GridキャッシュとCoherence*Webキャッシュに異なる構成プロパティを適用することが必要になることがあります。一連のキャッシュを指定および構成する最も効率的な方法は、ワイルドカード文字(*)を使用することです。ただし、これは両方のキャッシュ・セットに一致します。Coherence*Webキャッシュをエンティティ・キャッシュと区別するには、エンティティにのみ一致するワイルドカード・パターンを作成する必要があります。これを実行する1つの方法は、エンティティ・キャッシュ名に一意の接頭辞を付加することです。
次の手順は、TopLink Grid対応クラスに特定の接頭辞を付加するためにカスタム・セッション・カスタマイザを作成して使用する方法を示しています。
指定した接頭辞をTopLink対応クラスに付けるセッション・カスタマイザ・クラスを作成します。
例5-1は、EclipseLink SessionCustomizer
クラスを実装するカスタム・セッション・カスタマイザ・クラスであるCacheNamePrefixCustomizer
を示しています。このクラスは、TopLink対応クラスに追加される接頭辞を表すPREFIX_PROPERTY
myapp.cache-prefix
を定義します。プロパティの値は、persistence.xml
ファイルで指定することも(手順2で説明)、Persistence.createEntityManagerFactory
メソッドにオプションのプロパティ・マップで渡すこともできます。
例5-1 接頭辞を付加するセッション・カスタマイザ
import java.util.Collection;
import oracle.eclipselink.coherence.IntegrationProperties;
import oracle.eclipselink.coherence.integrated.cache.CoherenceInterceptor;
import oracle.eclipselink.coherence.integrated.internal.cache.CoherenceCacheHelper;
import org.eclipse.persistence.config.SessionCustomizer;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.sessions.Session;
public class CacheNamePrefixCustomizer implements SessionCustomizer {
private static final String PREFIX_PROPERTY = "myapp.cache-prefix";
public void customize(Session session) throws Exception {
// Look up custom persistence unit cache prefix property
String prefix = (String) session.getProperty(PREFIX_PROPERTY);
if (prefix == null) {
throw new RuntimeException(
"Cache name prefix customizer configured but prefix property '" +
PREFIX_PROPERTY + "' not specified");
}
// Iterate over all entity descriptors
Collection<ClassDescriptor> descriptors = session.getDescriptors().values();
for (ClassDescriptor classDescriptor : descriptors) {
// If entity is TopLink Grid-enabled, prepend cache name with prefix
if (CoherenceInterceptor.class.equals(classDescriptor.getCacheInterceptorClass())) {
String cacheName = CoherenceCacheHelper.getCacheName(classDescriptor);
classDescriptor.setProperty(IntegrationProperties.COHERENCE_CACHE_NAME, prefix + cacheName);
}
}
}
}
persistence.xml
ファイルを編集して接頭辞プロパティの値を宣言します。
次の例では、persistence.xml
ファイル内で接頭辞プロパティmyapp.cache-prefix
の値としてMyApp_
が定義されています。myapp.cache-prefix
接頭辞プロパティは、カスタム・セッション・カスタマイザ・ファイルで定義されます。
<property name="myapp.cache-prefix" value="MyApp_"/>
EclipseLink SessionCustomizer
クラスの詳細は、http://www.eclipse.org/eclipselink/
を参照してください。
persistence.xml
ファイルを編集し、カスタム・セッション・カスタマイザ・クラスの名前をeclipselink.session.customizer
コンテキスト・プロパティの値として追加します。
<property name="eclipselink.session.customizer" value="CacheNamePrefixCustomizer"/>
coherence-cache-config.xml
ファイルを編集し、キャッシュ・マッピングにワイルドカード文字を含む接頭辞の名前を追加します。
<cache-mapping>
<cache-name>MyApp_*</cache-name>
<scheme-name>eclipselink-distributed-readonly</scheme-name>
</cache-mapping>
エンティティ・キャッシュに指定されたデフォルト名のオーバーライドが必要になる場合があります。TopLink Gridでは、エンティティ・キャッシュ名はデフォルトでエンティティ名になります。次のリストは、キャッシュ名の決定方法とそれを明示的に変更する方法を示しています。
キャッシュ名はデフォルトで設定することも、明示的に設定することもできます。
デフォルト: キャッシュ名はデフォルトでエンティティ名になります。一方、エンティティ名は、デフォルトで設定することも明示的に設定することもできます。
デフォルト: エンティティ名はデフォルトでクラスの短縮名になります。
明示的: エンティティ名は、@Entity
注釈のname
プロパティを使用することで明示的に設定できます。
明示的: @Property
注釈を使用して、キャッシュ名を明示的に設定できます。
たとえば、次のコード部分は、Employee
クラスを示しています。デフォルトでは、エンティティ・キャッシュ名はEmployee
になります。ただし、@Property
注釈を使用することで、Employee
エンティティ・キャッシュの名前を強制的にEMP_CACHE
にすることができます。
import static oracle.eclipselink.coherence.IntegrationProperties.COHERENCE_CACHE_NAME;
import org.eclipse.persistence.annotations.Property;
...
@Entity(name="Emp")
@Property(name=COHERENCE_CACHE_NAME, value="EMP_CACHE")
public class Employee implements Serializable {
...
コードでエンティティ名がEmp
に明示的に指定されていることに注目してください。name="Emp"
値が指定されていなければ、エンティティの名前にはクラスの短縮名であるEmployee
がデフォルトで使用されます。