Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

393
Vistas
Apache Ignite: cómo obtener un elemento en caché sin clave de afinidad

Tengo dos cachés, uno es para Persona y otro para objetos de Empresa, especificando Person.Id como clave y Person.CompanyId como clave de afinidad.

 personCache.Put(new AffinityKey(p1.Id, p1.CompanyId), p1); companyCache.Put(c1.Id, c1);

¿Es posible obtener a la persona del caché usando Person.Id? (sin tener Person.CompanyId)?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Sí, pero no con la API Key-Value.

La API Key-Value, por definición, requiere una clave para acceder a los datos. Si su clave es AffinityKey(personId, companyId) entonces debe construir el objeto de clave completo para usar la operación IgniteCache::get .

Sin embargo, también existe la API de SQL, que es otra interfaz para acceder a los mismos datos. Puede declarar la memoria caché como una memoria caché habilitada para SQL y el personId de persona como un campo SQL en esa memoria caché.

Hay varias formas de crear una memoria caché habilitada para SQL:

  • Créelo con la instrucción CREATE TABLE (en lugar de especificarlo en la configuración del nodo o crearlo con el método createCache ).

  • Especifique indexedTypes como parte de CacheConfiguration y anote los campos de los objetos clave y de valor como @QuerySqlField .
    El problema con indexedTypes es que tienes que poner anotaciones en clases. Obviamente, esto no funcionará con la clase AffinityKey , ya que no puede cambiarla.

  • Especifique QueryEntity como parte de CacheConfiguration .
    El problema con QueryEntity es que puede volverse bastante complejo y, en general, es un poco más difícil de mantener que las anotaciones @QuerySqlField .

En su caso, recomendaría no usar la clase AffinityKey y crear su propia versión, llamémosla PersonKey . Puede anotar sus campos y usar indexedTypes .

A continuación se muestra un breve ejemplo:

 public class SqlFieldInKeyExample { static class PersonKey { @QuerySqlField long personId; @QuerySqlField @AffinityKeyMapped long companyId; public PersonKey(long personId, long companyId) { this.personId = personId; this.companyId = companyId; } } static class Person { @QuerySqlField String name; public Person(String name) { this.name = name; } } public static void main(String[] args) throws IgniteException { try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) { CacheConfiguration<PersonKey, Person> cfg = new CacheConfiguration<PersonKey, Person>() .setName("PersonCache") .setIndexedTypes(PersonKey.class, Person.class); IgniteCache<PersonKey, Person> cache = ignite.createCache(cfg); cache.put(new PersonKey(9000, 42), new Person("John Doe")); List<List<?>> result = cache.query(new SqlFieldsQuery("SELECT * FROM PERSON WHERE PERSONID = 9000")).getAll(); assert result.size() == 1; System.out.println(">>>>> Person: " + result.get(0)); } } }

La salida (entre otras cosas) es:

 >>>>> Person: [9000, 42, John Doe]
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda