Acceso a datos con índices (API Index)

Utilice la indexación para acceder más eficazmente a los datos.

Acerca de esta tarea

La clase HashIndex es una implementación de plug-in de índice incorporado que puede dar soporte a las dos interfaces de índice de la aplicación incorporadas: MapIndex y MapRangeIndex. También puede crear sus propios índices. Puede añadir HashIndex como un índice estático o dinámico a la correlación de respaldo, obtener el objeto de proxy de índice MapIndex o MapRangeIndex y utilizar el objeto de proxy de índice para buscar objetos almacenados en la memoria caché.

Si desea iterar a través de las claves en una correlación local, puede utilizar el índice predeterminado. Este índice no requiere ninguna configuración, pero se debe utilizar en el fragmento, utilizando una instancia de ObjectGrid o agente recuperada del método ShardEvents.shardActivated(ObjectGrid shard).

Nota: En un entorno distribuido, si el objeto de índice se obtiene del ObjectGrid de cliente, el índice tiene un objeto de índice de tipo cliente y todas las operaciones de índice se ejecutan en un ObjectGrid de servidor remoto. Si la correlación está particionada, las operaciones de índice se ejecutan en cada partición de forma remota. Los resultados de cada partición se fusionan antes de devolver los resultados a la aplicación. El rendimiento lo determina el número de particiones y el tamaño del resultado devuelto por cada partición. Es posible que se produzca un rendimiento bajo si ambos factores son altos.

Procedimiento

  1. Si desea utilizar índices que no sean el índice local predeterminado, añada plug-ins de índice a la correlación de respaldo.
    • Configuración XML:
      <backingMapPluginCollection id="person">
           <bean id="MapIndexplugin"
      			className="com.ibm.websphere.objectgrid.plugins.index.HashIndex">
               <property name="Name" type="java.lang.String" value="CODE" 
      						description="index name" />
               	<property name="RangeIndex" type="boolean" value="true"
      						description="true for MapRangeIndex" />
               <property name="AttributeName" type="java.lang.String" value="employeeCode" 
      						description="attribute name" />
           </bean>
      </backingMapPluginCollection>

      En este ejemplo de configuración XML, se utiliza la clase HashIndex incorporada como el plug-in de índice. La clase HashIndex da soporte a propiedades que los usuarios pueden configurar como, por ejemplo, Name, RangeIndex y AttributeName en el ejemplo anterior.

      • La propiedad Name se configura como CODE, una serie que identifica este plug-in de índice. El valor de la propiedad Name debe ser exclusivo dentro del ámbito de la BackingMap, y se puede utilizar para recuperar el objeto de índice por el nombre de la instancia de ObjectMap para la BackingMap.
      • La propiedad RangeIndex se configura como true, lo que significa que la aplicación puede difundir el objeto de índice recuperado a la interfaz MapRangeIndex. Si la propiedad RangeIndex se configura como false, la aplicación solo puede difundir el objeto de índice recuperado a la interfaz MapIndex. Un MapRangeIndex soporta las funciones para encontrar los datos utilizando las funciones de rango como, por ejemplo, mayor que, menor que, o ambos, mientras que un MapIndex sólo soporta las funciones de igual. Si el índice se utiliza por consulta, la propiedad RangeIndex se debe configurar en true en índices de un solo atributo. Para un índice de relación y un índice compuesto, la propiedad RangeIndex se debe configurar en false.
      • La propiedad AttributeName se configura como employeeCode, lo que significa que el atributo employeeCode del objeto almacenado en memoria caché se utiliza para crear un índice de un solo atributo. Si una aplicación necesita buscar objetos almacenados en memoria caché con varios atributos, la propiedad AttributeName se puede establecer en una lista delimitada por comas de atributos, lo que proporciona un índice compuesto.
    • Configuración programática:

      La interfaz BackingMap tiene dos métodos que puede utilizar para añadir plug-ins de índice estático: addMapIndexplugin y setMapIndexplugins. Si desea más información, consulte API de BackingMap. El ejemplo siguiente crea la misma configuración que el ejemplo de configuración XML:

      import com.ibm.websphere.objectgrid.ObjectGridManagerFactory;
      import com.ibm.websphere.objectgrid.ObjectGridManager;
      import com.ibm.websphere.objectgrid.ObjectGrid;
      import com.ibm.websphere.objectgrid.BackingMap;
      
          ObjectGridManager ogManager = ObjectGridManagerFactory.getObjectGridManager();
          ObjectGrid ivObjectGrid = ogManager.createObjectGrid( "grid" );
          BackingMap personBackingMap = ivObjectGrid.getMap("person");
      
          // utilizar la clase HashIndex incorporada como clase de plug-ins de índices.
          HashIndex mapIndexplugin = new HashIndex();
          mapIndexplugin.setName("CODE");
          mapIndexplugin.setAttributeName("EmployeeCode");
          mapIndexplugin.setRangeIndex(true);
          personBackingMap.addMapIndexplugin(mapIndexplugin);
  2. Acceda a valores y claves de correlación con índices.
    • Índice local:
      Para iterar por las claves y valores de una correlación local, puede utilizar el índice predeterminado. El índice predeterminado solo funciona en el fragmento, utilizando un fragmento o utilizando la instancia de ObjectGrid recuperada del método ShardEvents.shardActivated(ObjectGrid shard). Consulte el siguiente ejemplo:
      MapIndex keyIndex = (MapIndex)
      objMap.getIndex(MapIndexPlugin.SYSTEM_KEY_INDEX_NAME);
      Iterator keyIterator = keyIndex.findAll();
    • Índices estáticos:

      Después de que se añada un plug-in de índice estático a una configuración de BackingMap y la instancia de ObjectGrid que lo contiene se inicialice, las aplicaciones pueden recuperar el objeto de índice por nombre de la instancia de ObjectMap para la BackingMap. Difunda el objeto de índice a la interfaz de índices de aplicación. Ahora, las operaciones que soporta la interfaz de índice de aplicación se pueden ejecutar.

      Session session = ivObjectGrid.getSession();
      ObjectMap map = session.getMap("person ");
      MapRangeIndex codeIndex = (MapRangeIndex) m.getIndex("CODE");
      Iterator iter = codeIndex.findLessEqual(new Integer(15));
      while (iter.hasNext()) {
      Object key = iter.next();
      Object value = map.get(key);
      }
      // Cierre la sesión (opcional en la versión 7.1.1 y posterior) para un mejor rendimiento
      session.close();
    • Índices dinámicos:

      Puede crear y eliminar, mediante programación, índices dinámicos de una instancia de BackingMap en cualquier momento. Un índice dinámico se distingue de un índice estático en que el índice dinámico puede crearse después de que se inicialice la instancia de ObjectGrid que lo contiene. A diferencia de la indexación estática, la indexación dinámica es un proceso asíncrono y necesita estar en un estado preparado antes de poder utilizarlo. Este método utiliza el mismo acercamiento para recuperar y usar los índices dinámicos que los índices estáticos. Puede eliminar un índice dinámico si éste deja de utilizarse. La interfaz BackingMap tiene métodos para crear y eliminar índices dinámicos.

      Consulte la API BackingMap para obtener más información sobre los métodos createDynamicIndex y removeDynamicIndex.

      import com.ibm.websphere.objectgrid.ObjectGridManagerFactory;
      import com.ibm.websphere.objectgrid.ObjectGridManager;
      import com.ibm.websphere.objectgrid.ObjectGrid;
      import com.ibm.websphere.objectgrid.BackingMap;
      
              ObjectGridManager ogManager = ObjectGridManagerFactory.getObjectGridManager();
              ObjectGrid og = ogManager.createObjectGrid("grid");
              BackingMap bm = og.getMap("person");
              og.initialize();
      
              // crear índice después de la inicialización de ObjectGrid sin DynamicIndexCallback.
              bm.createDynamicIndex("CODE", true, "employeeCode", null);
      
              try {
                  // Si no se utiliza DynamicIndexCallback, debe esperar a que el índice esté preparado.
                  // El tiempo de espera depende del tamaño actual de la correlación
                  Thread.sleep(3000);
              } catch (Throwable t) {
                  // ...
              }
      
              // Cuando el índice esté preparado, las aplicaciones pueden intentar obtener
              //  la instancia de la interfaz de índices de aplicación.
              // Las aplicaciones deben encontrar un modo de asegurarse de que el índice está preparado para el uso,
              // si no se utiliza la interfaz DynamicIndexCallback.
              // El ejemplo siguiente muestra el modo de esperar a que el índice esté preparado.
              // Tenga en cuenta el tamaño de la correlación en el tiempo total de espera.
      
              Session session = og.getSession();
              ObjectMap m = session.getMap("person");
              MapRangeIndex codeIndex = null;
      
              int counter = 0;
              int maxCounter = 10;
              boolean ready = false;
              while (!ready && counter < maxCounter) {
                  try {
                      counter++;
                      codeIndex = (MapRangeIndex) m.getIndex("CODE");
                      ready = true;
                  } catch (IndexNotReadyException e) {
                      // implica que el índice no está preparado,...
                      System.out.println("Index is not ready. continue to wait.");
                      try {
                          Thread.sleep(3000);
                      } catch (Throwable tt) {
                          // ...
                      }
                  } catch (Throwable t) {
                      // excepción inesperada
                      t.printStackTrace();
                  }
              }
      
              if (!ready) {
                  System.out.println("Index is not ready.  Need to handle this situation.");
              }
      
              // Usar el índice para realizar consultas
              // Consulte la interfaz MapIndex o MapRangeIndex para obtener información sobre las operaciones admitidas.
              // El atributo de objeto en el que se crea el índice es EmployeeCode.
              // Presuponga que el atributo EmployeeCode es de tipo Integer: el
              // parámetro que se pasa a operaciones de índices tiene este tipo de datos.
      
              Iterator iter = codeIndex.findLessEqual(new Integer(15));
      
              // eliminar el índice dinámico cuando ya no se necesite
      
              bm.removeDynamicIndex("CODE");// Cierre la sesión (opcional en la versión 7.1.1 y posterior) para un mejor rendimiento
      	session.close();

Qué hacer a continuación

Puede utilizar la interfaz DynamicIndexCallback para obtener notificaciones en los sucesos de índice. Si desea más información, consulte Interfaz DynamicIndexCallback.