Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

391
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!