Cuando una configuración de eXtreme Scale utiliza la estrategia de ubicación de partición fija, depende del método hash de la clave en una partición para insertar, obtener, actualizar o eliminar el valor. Se llama al método hashCode en la clave y debe estar bien definido, si se crea una clave personalizada. Sin embargo, otra opción es utilizar la interfaz PartitionableKey. Con la interfaz PartitionableKey, puede utilizar un objeto que no sea la clave para realizar el método hash en una partición.
Puede utilizar la interfaz PartitionableKey en situaciones en las que existen varias correlaciones y los datos que confirma están relacionados y, por lo tanto, deben colocarse en la misma partición. WebSphere eXtreme Scale no soporta el compromiso de dos fases, así que varias transacciones de correlaciones no se deben comprometer, si se dividen en varias particiones. Si PartitionableKey realiza un método hash en la misma partición para las claves en distintas correlaciones del mismo conjunto de correlaciones, se pueden comprometer de forma conjunta.
También puede utilizar la interfaz PartitionableKey cuando se deban colocar grupos de claves en la misma partición, pero no, necesariamente, durante una única transacción. Si se debe realizar el método hash en claves de una ubicación, departamento, tipo de dominio o algún otro tipo de identificador, las claves secundarias se pueden asignar a un PartitionableKey padre.
Por ejemplo, los empleados debe realizar el método hash en la misma partición que su departamento. Cada clave de empleado debería tener un objeto PartitionableKey que pertenezca a la correlación de departamento. Tanto el empleado como el departamento deberán realizar un método hash en la misma partición.
La interfaz PartitionableKey proporciona un método, llamado ibmGetPartition. El objeto devuelto de este método debe implementar el método hashCode. Se utilizará el resultado devuelto del uso del método hashCode alternativo para direccionar la clave a una partición.
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;
// Los datos que forman la clave de objeto de datos real.
public final String realKey;
// La clave del objeto de datos que desea usar para el direccionamiento.
// Ésta suele ser la clave de un objeto principal.
public final Object keyToRouteWith;
public RoutableKey(String realKey, Object keyToRouteWith) {
super();
this.realKey = realKey;
this.keyToRouteWith = keyToRouteWith;
}
/**
* Devuelva el código hash de la clave utilizada para el direccionamiento.
* Si no se proporciona, eXtreme Scale utilizará el código hash de ESTA clave.
*/
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;
}
}