eXtreme Scale 構成が固定区画配置ストラテジーを使用しているとき、この構成は区画のキーのハッシュに応じて値の挿入、取得、更新、または除去を行います。このキーで hashCode メソッドが呼び出され、カスタム・キーが作成される場合は、hashCode メソッドが明確に定義されていなければなりません。ただし、PartitionableKey インターフェースを使用するもう 1 つのオプションがあります。PartitionableKey インターフェースがあれば、キー以外のオブジェクトを使用して区画にハッシュすることができます。
PartitionableKey インターフェースは、複数のマップが存在し、かつコミットしたデータが関連付けられ、したがって同じ区画に配置されなければならないような状況で使用することができます。WebSphere® eXtreme Scale は、複数のマップ・トランザクションが複数の区画にまたがる場合は、これらのトランザクションがコミットされないようにするため、2 フェーズ・コミットをサポートしません。 同じマップ・セット内の異なるマップにあるキーについて PartitionableKey が同じ区画にハッシュする場合は、トランザクションをまとめてコミットすることができます。
また、キーのグループを同じ区画に配置する必要があるが、必ずしも単一トランザクションのときでない場合にも PartitionableKey インターフェースを使用することができます。ロケーション、部門、ドメイン・タイプ、またはその他のタイプの ID に基づいてキーをハッシュする必要がある場合は、子キーに親 PartitionableKey を与えることができます。
例えば、従業員はその所属する部門と同じ区画にハッシュする必要があります。各従業員キーは部門マップに属する PartitionableKey オブジェクトを持ちます。そうすると、従業員と部門の両方が同じ区画にハッシュされます。
PartitionableKey インターフェースには ibmGetPartition というメソッドが 1 つあります。 このメソッドから戻されたオブジェクトは hashCode メソッドを実装する必要があります。 代替 hashCode を使用したために戻された結果は区画のキーを経路指定するために使用されます。
package com.ibm.websphere.cjtester;
import java.io.Serializable;
import com.ibm.websphere.objectgrid.plugins.PartitionableKey;
public class RoutableKey implements Serializable, Cloneable, PartitionableKey {
private static final long serialVersionUID = 1L;
// The data that makes up the actual data object key.
public final String realKey;
// The key of the data object you want to use for routing.
// This is typically the key of a parent object.
public final Object keyToRouteWith;
public RoutableKey(String realKey, Object keyToRouteWith) {
super();
this.realKey = realKey;
this.keyToRouteWith = keyToRouteWith;
}
/**
* Return the hashcode of the key we are using for routing.
* If not supplied, eXtreme Scale will use the hashCode of THIS key.
*/
public Object ibmGetPartition() {
return new Integer(keyToRouteWith.hashCode());
}
@Override
public RoutableKey clone() throws CloneNotSupportedException {
return (RoutableKey) super.clone();
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((keyToRouteWith == null) ? 0 : keyToRouteWith.hashCode());
result = prime * result + ((realKey == null) ? 0 : realKey.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
RoutableKey other = (RoutableKey) obj;
if (keyToRouteWith == null) {
if (other.keyToRouteWith != null) return false;
} else if (!keyToRouteWith.equals(other.keyToRouteWith)) return false;
if (realKey == null) {
if (other.realKey != null) return false;
} else if (!realKey.equals(other.realKey)) return false;
return true;
}
}