ObjectTransformer プラグイン

ObjectTransformer プラグインを使用すると、パフォーマンス向上のために、キャッシュ内のオブジェクトをシリアライズ、デシリアライズ、およびコピーすることができます。

Deprecated feature ObjectTransformer インターフェースは、DataSerializer プラグインで置換されました。これを使用して、既存の製品 API がデータと効率的に対話できるように WebSphere® eXtreme Scale 内の任意のデータを効率的に格納できます。

プロセッサーの使用に関するパフォーマンス上の問題がある場合は、各マップに ObjectTransformer プラグインを追加します。 ObjectTransformer プラグインを使用しない場合、合計プロセッサー時間の 60 から 70 パーセントまではエントリーのシリアライズとコピーに費やされます。

目的

ObjectTransformer プラグインがあれば、アプリケーションで以下の操作に対するカスタム・メソッドを提供できます。
  • エントリーに対するキーのシリアライズまたはデシリアライズ
  • エントリーに対する値のシリアライズまたはデシリアライズ
  • エントリーに対するキーまたは値のコピー

ObjectTransformer プラグインが提供されない場合、 ObjectGrid はシリアライズおよびデシリアライズのシーケンスを使用して オブジェクトをコピーするので、ユーザーがキーと値のシリアライズを行う必要があります。 この方法には費用がかかるので、パフォーマンスが重大である場合には ObjectTransformer プラグインを使用してください。 アプリケーションが、トランザクションのオブジェクトを 最初に検索する際に、コピーが行われます。 このコピーは、マップのコピー・モードを NO_COPY に設定すると行われません。あるいは、コピー・モードを COPY_ON_READ に設定すると、コピー数を軽減できます。アプリケーションの必要に応じて、 このプラグインにカスタム・コピー・メソッドを提供することによって、 コピー操作を最適化します。 このようなプラグインにより、コピー・オーバーヘッドを合計プロセッサー時間の 65-70 パラメーターから 2/3 パーセントに軽減できます。

デフォルトの copyKey および copyValue メソッド実装では、最初に clone メソッド (このメソッドが提供されている場合) を使用しようとします。 clone メソッド実装が提供されていない場合は、実装のデフォルトはシリアライゼーションになります。

eXtreme Scale が分散モードで実行されているときは、オブジェクト・シリアライゼーションも直接使用されます。 LogSequence は、変更内容を ObjectGrid のピアに送信する前に、ObjectTransformer プラグインを使用して、キーおよび値のシリアライズを支援します。 組み込み Java Developer Kit シリアライゼーションを使用するのではなく、シリアライゼーションのカスタム・メソッドを提供するときは、注意が必要です。 オブジェクトのバージョン管理は複雑な問題であり、 カスタム・メソッドがバージョン管理用に設計されていることが確認できない場合、 バージョンの互換性に問題が発生することがあります。

以下のリストでは、eXtreme Scale がキーと値の両方のシリアライズを試みる方法を説明しています。
  • カスタム ObjectTransformer プラグインが作成され、プラグインされている場合、eXtreme Scale は ObjectTransformer インターフェース内のメソッドを呼び出して、キーと値をシリアライズし、オブジェクトのキーおよび値のコピーを取得します。
  • カスタム ObjectTransformer プラグインが使用されていない場合、eXtreme Scale はデフォルトに従って値のシリアライズとデシリアライズを行います。 デフォルト・プラグインが使用されている場合、各オブジェクトは、外部化可能またはシリアライズ可能として実装されます。
    • オブジェクトが Externalizable インターフェースをサポートする場合、 writeExternal メソッドが呼び出されます。 外部化可能として実装されたオブジェクトは、 パフォーマンスを向上させます。
    • Externalizablee インターフェースをサポートせず、Serializable インターフェースを実装しないオブジェクトは、ObjectOutputStream メソッドを使用して保存されます。

ObjectTransformer インターフェースの使用

ObjectTransformer は、ObjectTransformer インターフェースを実装し、共通 ObjectGrid プラグイン規則に準拠している必要があります。

ObjectTransformer オブジェクトを BackingMap 構成に追加する場合、以下のように、プログラマチック構成と XML 構成の 2 つの方法が使用されます。

ObjectTransformer オブジェクトのプログラマチックなプラグイン

以下のコード・スニペットは、カスタム ObjectTransformer オブジェクトを作成し、それを BackingMap に追加します。
ObjectGridManager objectGridManager = ObjectGridManagerFactory.getObjectGridManager();
ObjectGrid myGrid = objectGridManager.createObjectGrid("myGrid", false);
BackingMap backingMap = myGrid.getMap("myMap");
MyObjectTransformer myObjectTransformer = new MyObjectTransformer();
backingMap.setObjectTransformer(myObjectTransformer);

ObjectTransformer をプラグインするための XML 構成方法

ObjectTransformer 実装のクラス名が、com.company.org.MyObjectTransformer クラスであると仮定します。このクラスは、ObjectTransformer インターフェースを実装します。ObjectTransformer 実装は、以下の XML を使用して構成することができます。
<?xml version="1.0" encoding="UTF-8"?>
<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="myGrid">
	    <backingMap name="myMap" pluginCollectionRef="myMap" />
        </objectGrid>
    </objectGrids>

    <backingMapPluginCollections>
	<backingMapPluginCollection id="myMap">
	     <bean id="ObjectTransformer" className="com.company.org.MyObjectTransformer" />
	</backingMapPluginCollection>
    </backingMapPluginCollections>
</objectGridConfig>

ObjectTransformer の使用に関するシナリオ

ObjectTransformer プラグインは、以下の状態で使用できます。
  • シリアライズ不能オブジェクト
  • シリアライズ可能オブジェクトであるが、シリアライゼーション・パフォーマンスを改善する
  • キーまたは値のコピー
以下の例で、ObjectGrid は Stock クラスのストアに使用されます。
/**
* Stock object for ObjectGrid demo
*
*
*/
public class Stock implements Cloneable {
    String ticket;
    double price;
    String company;
    String description;
    int serialNumber;
    long lastTransactionTime;
    /**
    * @return Returns the description.
    */
    public String getDescription() {
        return description;
    }
    /**
    * @param description The description to set.
    */
    public void setDescription(String description) {
        this.description = description;
    }
    /**
    * @return Returns the lastTransactionTime.
    */
    public long getLastTransactionTime() {
        return lastTransactionTime;
    }
    /**
    * @param lastTransactionTime The lastTransactionTime to set.
    */
    public void setLastTransactionTime(long lastTransactionTime) {
        this.lastTransactionTime = lastTransactionTime;
    }
    /**
    * @return Returns the price.
    */
    public double getPrice() {
        return price;
    }
    /**
    * @param price The price to set.
    */
    public void setPrice(double price) {
        this.price = price;
    }
    /**
    * @return Returns the serialNumber.
    */
    public int getSerialNumber() {
        return serialNumber;
    }
    /**
    * @param serialNumber The serialNumber to set.
    */
    public void setSerialNumber(int serialNumber) {
        this.serialNumber = serialNumber;
    }
    /**
    * @return Returns the ticket.
    */
    public String getTicket() {
        return ticket;
    }
    /**
    * @param ticket The ticket to set.
    */
    public void setTicket(String ticket) {
        this.ticket = ticket;
    }
    /**
    * @return Returns the company.
    */
    public String getCompany() {
        return company;
    }
    /**
    * @param company The company to set.
    */
    public void setCompany(String company) {
        this.company = company;
    }
    //clone
    public Object clone() throws CloneNotSupportedException
    {
        return super.clone();
    }
}

Stock クラス用に、カスタム・オブジェクト変換プログラム・クラスを作成できます。

/**
* Custom implementation of ObjectGrid ObjectTransformer for stock object
*
*/
public class MyStockObjectTransformer implements ObjectTransformer {
/* (non−Javadoc)
* @see
* com.ibm.websphere.objectgrid.plugins.ObjectTransformer#serializeKey
* (java.lang.Object,
* java.io.ObjectOutputStream)
*/
public void serializeKey(Object key, ObjectOutputStream stream) throws IOException {
    String ticket= (String) key;
    stream.writeUTF(ticket);
}

/* (non−Javadoc)
* @see com.ibm.websphere.objectgrid.plugins.
ObjectTransformer#serializeValue(java.lang.Object,
java.io.ObjectOutputStream)
*/
public void serializeValue(Object value, ObjectOutputStream stream) throws IOException {
    Stock stock= (Stock) value;
    stream.writeUTF(stock.getTicket());
    stream.writeUTF(stock.getCompany());
    stream.writeUTF(stock.getDescription());
    stream.writeDouble(stock.getPrice());
    stream.writeLong(stock.getLastTransactionTime());
    stream.writeInt(stock.getSerialNumber());
}

/* (non−Javadoc)
* @see com.ibm.websphere.objectgrid.plugins.
ObjectTransformer#inflateKey(java.io.ObjectInputStream)
*/
public Object inflateKey(ObjectInputStream stream) throws IOException, ClassNotFoundException {
    String ticket=stream.readUTF();
    return ticket;
}

/* (non−Javadoc)
* @see com.ibm.websphere.objectgrid.plugins.
ObjectTransformer#inflateValue(java.io.ObjectInputStream)
*/

public Object inflateValue(ObjectInputStream stream) throws IOException,	ClassNotFoundException {
    Stock stock=new Stock();
    stock.setTicket(stream.readUTF());
    stock.setCompany(stream.readUTF());
    stock.setDescription(stream.readUTF());
    stock.setPrice(stream.readDouble());
    stock.setLastTransactionTime(stream.readLong());
    stock.setSerialNumber(stream.readInt());
    return stock;
}

/* (non−Javadoc)
* @see com.ibm.websphere.objectgrid.plugins.
ObjectTransformer#copyValue(java.lang.Object)
*/
public Object copyValue(Object value) {
    Stock stock = (Stock) value;
    try {
        return stock.clone();
    }
    catch (CloneNotSupportedException e)
    {
        // display exception message    }
}

/* (non−Javadoc)
* @see com.ibm.websphere.objectgrid.plugins.
ObjectTransformer#copyKey(java.lang.Object)
*/
public Object copyKey(Object key) {
    String ticket=(String) key;
    String ticketCopy= new String (ticket);
    return ticketCopy;
}
}
次に、このカスタム MyStockObjectTransformer クラスを BackingMap にプラグインします。
ObjectGridManager ogf=ObjectGridManagerFactory.getObjectGridManager();
ObjectGrid og = ogf.getObjectGrid("NYSE");
BackingMap bm = og.defineMap("NYSEStocks");
MyStockObjectTransformer ot = new MyStockObjectTransformer();
bm.setObjectTransformer(ot);