ヘッダーをスキップ
Oracle® Coherence Oracle ToplinkおよびCoherence Grid統合ガイド
リリース3.7.1
B71691-01
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次
索引へ移動
索引

前
 
次
 

5 ベスト・プラクティス

この章では、TopLink Gridをバイト・コード・ウィービングおよび遅延ロードとともに使用する方法の推奨事項を示します。

5.1 バイト・コード・ウィービングでのコンパイル済Javaクラスの変更

バイトコードウィービングは、コンパイル済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エンティティの動的ウィービングを構成する方法に関する項を参照してください。

http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_(ELUG)#How_to_Configure_Dynamic_Weaving_for_JPA_Entities_Using_the_EclipseLink_Agent

Coherenceキャッシュ・サーバーでバイト・コード・ウィービングを有効にするには、-javaagent:<PATH>\eclipselink.jarでJava VMを起動する必要があります。Java SEクライアント・アプリケーションは、-javaagent引数を指定して実行する必要があります。

静的および動的バイト・コード・ウィービングの構成と無効化の詳細は、EclipsepediaEclipseLink JPAウィービングの使用に関する項を参照してください。

http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_(ELUG)#Using_EclipseLink_JPA_Weaving

5.2 遅延ロードでのデータベース問合せの遅延

遅延ロードは、必要になるまでデータベースへのオブジェクトの問合せを遅延するために使用する手法です。これにより、アプリケーションによってロードされるデータ量を削減し、スループットを向上できます。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クラスの変更」を参照してください。

5.3 TopLink Gridを使用するアプリケーションに対するニア・キャッシュの定義

ニア・キャッシュは、Oracle Coherenceによって提供される標準キャッシュ構成の1つです。ニア・キャッシュを使用すると、オブジェクトを繰り返し取得する場合にネットワーク・アクセスを回避することでスループットを向上することができます。たとえば、ユーザーが特定のWebサーバーに固定されている環境では、ニア・キャッシュによりパフォーマンスが向上する可能性があります。

ニア・キャッシュはハイブリッド・キャッシュであり、サイズの制限された高速なデータ・アクセスを提供するフロント・キャッシュと、スケーラブルで要求に応じてロード可能であり、フェイルオーバー保護を提供する容量の大きいバック・キャッシュで構成されます。

Toplink Gridを使用するアプリケーションの場合、Oracle Coherenceを使用する他のアプリケーションと同じ方法でニア・キャッシュを構成します。ニア・キャッシュの詳細は、Oracle Coherence開発者ガイドのニア・キャッシュとニア・キャッシュ・スキームの定義に関する項を参照してください。


注意:

ニア・キャッシュは、Coherenceキャッシュのget操作においてのみ使用され、Filter操作の実行時には使用されません。これは、Filter操作は各メンバーに送信され、各メンバーが結果をコール元に直接返すためです。この場合、ニア・キャッシュに値は追加されません。

これは、JPQL問合せを使用している場合に問題となることもあります。TopLink Gridのグリッド読取りまたはグリッド・エンティティ構成では、JPQL問合せはFilter操作にマップされます。いずれの構成の場合も、TopLink JPQL問合せを実行してもキャッシュ・ヒットは発生しません。


5.4 キャッシュ構成において接頭辞付きのキャッシュ名でワイルドカードが使用されるようにする

TopLink GridをCoherenceキャッシュおよびCoherence*Webを使用するアプリケーションとともに使用する場合、エンティティに対するTopLink GridキャッシュとCoherence*Webキャッシュに異なる構成プロパティを適用することが必要になることがあります。一連のキャッシュを指定および構成する最も効率的な方法は、ワイルドカード文字(*)を使用することです。ただし、これは両方のキャッシュ・セットに一致します。Coherence*Webキャッシュをエンティティ・キャッシュと区別するには、エンティティにのみ一致するワイルドカード・パターンを作成する必要があります。これを実行する1つの方法は、エンティティ・キャッシュ名に一意の接頭辞を付加することです。

次の手順は、TopLink Grid対応クラスに特定の接頭辞を付加するためにカスタム・セッション・カスタマイザを作成して使用する方法を示しています。

  1. 指定した接頭辞を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);
             }
          }
       }
    }
    
  2. 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/を参照してください。

  3. persistence.xmlファイルを編集し、カスタム・セッション・カスタマイザ・クラスの名前をeclipselink.session.customizerコンテキスト・プロパティの値として追加します。

    <property name="eclipselink.session.customizer" value="CacheNamePrefixCustomizer"/>
    
  4. coherence-cache-config.xmlファイルを編集し、キャッシュ・マッピングにワイルドカード文字を含む接頭辞の名前を追加します。

    <cache-mapping>
        <cache-name>MyApp_*</cache-name>
        <scheme-name>eclipselink-distributed-readonly</scheme-name>
    </cache-mapping>
    

5.5 デフォルト・キャッシュ名のオーバーライド

エンティティ・キャッシュに指定されたデフォルト名のオーバーライドが必要になる場合があります。TopLink Gridでは、エンティティ・キャッシュ名はデフォルトでエンティティ名になります。次のリストは、キャッシュ名の決定方法とそれを明示的に変更する方法を示しています。

キャッシュ名はデフォルトで設定することも、明示的に設定することもできます。

たとえば、次のコード部分は、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がデフォルトで使用されます。