分散環境におけるエンティティー・マネージャー

ローカル ObjectGrid とともに、あるいは分散 eXtreme Scale 環境で EntityManager API を使用することができます。主な違いは、このリモート環境への接続方法です。 接続を確立した後は、Session オブジェクトを使用した場合と EntityManager API を使用した場合に違いはありません。

必須構成ファイル

以下に示した XML 構成ファイルが必要です。
  • ObjectGrid 記述子 XML ファイル
  • エンティティー記述子 XML ファイル
  • デプロイメントまたはデータ・グリッド記述子 XML ファイル

これらのファイルには、サーバーがホストするエンティティーと BackingMaps を指定します。

エンティティー・メタデータ記述子ファイルには、 使用されるエンティティーの記述が含まれています。少なくとも、エンティティー・クラスおよび名前を指定する必要があります。Java Platform, Standard Edition 5 環境で 稼働している場合、eXtreme Scale は、エンティティー・クラスと そのアノテーションを自動的に読み取ります。エンティティー・クラスにアノテーションがない場合、またはクラス属性のオーバーライドが必要な場合には、追加の XML 属性を定義できます。 エンティティーをクラスレスで登録している場合は、すべてのエンティティー情報を XML ファイルのみに指定してください。

以下の XML 構成スニペットを使用して、データ・グリッドをエンティティーとともに定義できます。このスニペットでは、bookstore という名前の ObjectGrid と、関連付ける order という名前のバックアップ・マップがサーバーによって作成されます。objectgrid.xml ファイルのスニペットは、entity.xml ファイルを参照します。この例では、entity.xml ファイルに含まれているエンティティーは Order エンティティーの 1 つのみです。

objectgrid.xml
<objectGridConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://ibm.com/ws/objectgrid/config ../objectGrid.xsd"
 xmlns="http://ibm.com/ws/objectgrid/config">

 <objectGrids>
    <objectGrid name="bookstore" entityMetadataXMLFile="entity.xml">
     <backingMap name="Order"/>
    </objectGrid>
</objectGrids>

</objectGridConfig>

objectgrid.xml ファイルは、entityMetadataXMLFile 属性を使用して entity.xml ファイルを指定します。 値は、相対ディレクトリーにすることも絶対パスにすることも可能です。
  • 相対ディレクトリーの場合: objectgrid.xml ファイルの場所に対して相対的な場所を指定します。
  • 絶対パスの場合: file:// または http:// などの URL 形式で場所を指定します。
entity.xml ファイルの例を以下に示します。
entity.xml
<entity-mappings xmlns="http://ibm.com/ws/projector/config/emd"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://ibm.com/ws/projector/config/emd ./emd.xsd">
	<entity class-name="com.ibm.websphere.tutorials.objectgrid.em.
				distributed.step1.Order" name="Order"/>
</entity-mappings>
この例では、orderNumber フィールドと desc フィールドが同じようにアノテーションを付けられて Order クラスにあると想定しています。

同等のクラスレス entity.xml は以下のようになります。

classless entity.xml
<entity-mappings xmlns="http://ibm.com/ws/projector/config/emd"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://ibm.com/ws/projector/config/emd ./emd.xsd">
	<entity class-name="@Order " name="Order">
	    <description>"Entity named: Order"</description>
        <attributes>
            <id name="orderNumber" type="int"/>
            <basic name="desc" type="java.lang.String"/>
        </attributes>
	</entity>
</entity-mappings>
サーバーの始動については、スタンドアロン・サーバーの始動を参照してください。deployment.xmlobjectgrid.xml の両方のファイルを使用して、カタログ・サーバーを始動します。

分散 eXtreme Scale サーバーへの接続

以下のコードは、同じコンピューター上にあるクライアントとサーバー用の接続メカニズムを有効にします。
String catalogEndpoints="localhost:2809";
URL clientOverrideURL= new URL("file:etc/emtutorial/distributed/step1/objectgrid.xml");
ClientClusterContext clusterCtx = ogMgr.connect(catalogEndpoints, null, clientOverrideURL);
ObjectGrid objectGrid=ogMgr.getObjectGrid(clusterCtx, "bookstore");
上のコード・スニペットで、リモート eXtreme Scale サーバーへの参照に注意してください。 接続を確立した後、EntityManager API メソッド (persistupdateremove、および find など) を起動できます。
重要: エンティティーを使用している場合、クライアントのオーバーライド ObjectGrid 記述子 XML ファイルを connect メソッドに渡してください。ヌル値が clientOverrideURL プロパティーに渡され、 クライアントのディレクトリー構造がサーバーと異なると、 クライアントは、ObjectGrid または エンティティー記述子 XML ファイルを見つけることができない場合があります。最低限できることは、サーバーの ObjectGrid およびエンティティー XML ファイルを クライアントにコピーすることです。
以前は、ObjectGrid クライアントでエンティティーを使用するには、以下の 2 つの方法のうちの 1 つで、ObjectGrid XML およびエンティティー XML をクライアントで使用できるようにする必要がありました。
  1. 最優先の ObjectGrid XML を ObjectGridManager.connect(String catalogServerEndpoints, ClientSecurityConfiguration securityProps, URL overRideObjectGridXml) メソッドに渡します。

    String catalogEndpoints="myHost:2809";
    URL clientOverrideURL= new URL("file:etc/emtutorial/distributed/step1/objectgrid.xml");
    ClientClusterContext clusterCtx = ogMgr.connect(catalogEndpoints, null, clientOverrideURL);
    ObjectGrid objectGrid=ogMgr.getObjectGrid(clusterCtx, "bookstore");

  2. 指定変更ファイルにヌルを渡し、ObjectGrid XML および参照先エンティティー XML がサーバー上と同じパスにあるクライアントで使用可能になるようにします。

    String catalogEndpoints="myHost:2809";
    ClientClusterContext clusterCtx = ogMgr.connect(catalogEndpoints, null, null);
    ObjectGrid objectGrid=ogMgr.getObjectGrid(clusterCtx, "bookstore");

クライアント・サイドでサブセット・エンティティーを使用するか使用しないかに関わらず、XML ファイルは必要でした。 サーバーで定義されたエンティティーを使用するために、これらのファイルは既に必要ありません。 その代わり、前のセクションのオプション 2 のように overRideObjectGridXml パラメーターとしてヌルを渡します。 XML ファイルがサーバーに設定された同じパス上で検出されない場合、クライアントはサーバーのエンティティー構成を使用します。

ただし、クライアントのサブセット・エンティティーを使用する場合は、オプション 1 のようにオーバーライドする ObjectGrid XML を指定してください。

クライアントおよびサーバー・サイドのスキーマ

サーバー・サイド・スキーマは、サーバー上のマップに保管されるデータのタイプを定義します。クライアント・サイド・スキーマは、サーバー上のスキーマからアプリケーション・オブジェクトへのマッピングです。例えば、以下のようなサーバー・サイド・スキーマもあります。
@Entity
class ServerPerson
{
  @Id String ssn;
  String firstName;
  String surname;
  int age;
  int salary;
}
クライアントには、以下の例に示しているようなアノテーション付きのオブジェクトもあります。
@Entity(name="ServerPerson")
class ClientPerson
{
  @Id @Basic(alias="ssn") String socialSecurityNumber;
  String surname;
}
このクライアントは、サーバー・サイド・エンティティーを受け取り、そのエンティティーのサブセットをクライアント・オブジェクトに射影します。 この射影により、クライアント側の処理能力とメモリーを節約できます。その理由は、クライアントは、サーバー・サイド・エンティティーに入っているすべての情報ではなく、クライアントが必要とする情報だけを保有するからです。異なるアプリケーションは、すべてのアプリケーションにデータ・アクセスのためのクラス・セットを強制的に共有させる代わりに、それぞれ独自のオブジェクトを使用することができます。

クライアント・サイド・エンティティー記述子 XML ファイルは、以下の場合に必要です。クライアント・サイドがクラスレスで実行されていて、サーバーがクラス・ベースのエンティティーとともに実行されている場合、あるいは、サーバーはクラスレスで、クライアントがクラス・ベースのエンティティーを使用している場合です。クラスレスのクライアント・モードでは、クライアントは物理クラスへのアクセス権を持たずに引き続きエンティティー照会を実行することができます。 サーバーが上記の ServerPerson エンティティーを登録したとすると、クライアントは以下のように entity.xml でデータ・グリッドをオーバーライドします。

<entity-mappings xmlns="http://ibm.com/ws/projector/config/emd"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://ibm.com/ws/projector/config/emd ./emd.xsd">
	<entity class-name="@ServerPerson" name="Order">
	    <description>"Entity named: Order"</description>
        <attributes>
            <id name="socialSecurityNumber" type="java.lang.String"/>
            <basic name="surname" type="java.lang.String"/>
        </attributes>
	</entity>
</entity-mappings>

このファイルは、実際のアノテーション付きクラスの指定をクライアントに要求することなく、クライアントで同等のサブセット・エンティティーを取得します。サーバーがクラスレスで、クライアントがクラスレスでない場合、クライアントはオーバーライドするエンティティー記述子 XML ファイルを提供します。 このエンティティー記述子 XML ファイルには、クラス・ファイル参照へのオーバーライドが含まれます。

スキーマの参照

アプリケーションが Java SE 5 で実行している場合、アノテーションを使用してアプリケーションをオブジェクトに追加することができます。EntityManager は、それらのオブジェクトのアノテーションからスキーマを読み取ることができます。 アプリケーションは、entity.xml ファイルを使用して、これらのオブジェクトの参照とともに eXtreme Scale ランタイムを提供します。このファイルは、objectgrid.xml ファイルから参照されます。 entity.xml ファイルには、すべてのエンティティーがリストされ、各エンティティーはクラスまたはスキーマに関連付けられています。 適切なクラス名が指定されている場合には、アプリケーションはそれらのクラスから Java SE 5 のアノテーションを読み取って、スキーマを判別しようとします。クラス・ファイルにアノテーションを付けない場合、あるいはクラス名としてクラスレス ID を指定している場合は、スキーマは XML ファイルから取得されます。 この XML ファイルは、すべての属性、キー、およびリレーションシップをエンティティーごとに指定する場合に使用されます。

ローカル・データ・グリッドの場合、XML ファイルは不要です。 プログラムは ObjectGrid 参照を取得し、ObjectGrid.registerEntities メソッドを呼び出して、Java SE 5 のアノテーションを付けられたクラスのリストまたは XML ファイルを指定します。

ランタイムは、この XML ファイルまたはアノテーション付きクラスのリストを使用して、エンティティー名、属性名とタイプ、キー・フィールドとタイプ、およびエンティティー間のリレーションシップを見つけます。 eXtreme Scale がサーバーで実行している場合、 またはスタンドアロン・モードで実行している場合は、各エンティティーから付けられた名前を持つマップが 自動的に作成されます。アプリケーション、または Spring などの注入フレームワークのいずれかによって 設定された、objectgrid.xml ファイルまたは API を使用して、 これらのマップをさらにカスタマイズすることができます。

エンティティー・メタデータ記述子ファイル

メタデータ記述子ファイルについて詳しくは、emd.xsd ファイルを参照してください。