3 Ekim 2021 Pazar

CacheConfiguration Sınıfı - Thick Client Tabloyu/Modeli Temsil Eder

Giriş
Şu satırı dahil ederiz
import org.apache.ignite.configuration.CacheConfiguration;
Bu sınıf tabloyu veya modeli temsil eder. Artık nasıl düşünmek kolayınıza geliyorsa.

setAtomicityMode metodu
Örnek
Şöyle yaparız
IgniteConfiguration igniteConfig = ...
  
CacheConfiguration accountCacheCfg = new CacheConfiguration()
  .setName("BREED")
  .setAtomicityMode(TRANSACTIONAL)
  .setIndexedTypes(String.class, Breed.class);
  
igniteConfig.setCacheConfiguration(accountCacheCfg);
setBackups metodu
Örnek
Şöyle yaparız
CacheConfiguration<PersonKey, Person> personCfg = new CacheConfiguration<>
  ("persons");
personCfg.setBackups(1);
setIndexedTypes metodu
Örnek
Şöyle yaparız
CacheConfiguration<PersonKey, Person> cfg = new CacheConfiguration<>()
  .setName("PersonCache")
  .setIndexedTypes(PersonKey.class, Person.class);
setName metodu
Açıklaması şöyle. Eğer cache isimlerinin hash code değerleri çakışırsa Cache ID conflict hatası alırız
Ignite uses cache name hash code as a unique cache identifier for performance reasons.

setSqlFunctionClasses metodu
Örnek
Elimizde şöyle bir kod olsun. Burada bir POJO ve kendi SQL metodumuz var
public class Student implements Serializable {
  @QuerySqlField(index = true)
  private int Id;
  @QuerySqlField(index = true)
  private String name;

  @QuerySqlField(index = true)
  private List<Double> marks;
  ...
}

public class MySqlFunctions {
  @QuerySqlFunction
  public static double maxOf(List<Double> marksInorder) {
    Collections.sort(marksInorder, Collections.reverseOrder());
    return marksInorder.get(0);
  }
}
Kendi SQL metodumuzu Cache ile ilişkilendirmek için şöyle yaparız
CacheConfiguration<Integer, Student> config = new CacheConfiguration<>("students");
config.setIndexedTypes(Integer.class, Student.class);
config.setSqlFunctionClasses(MySqlFunctions.class);
Kullanmak için şöyle yaparız. Burada Student nesnesine ait "marks" listesi kendi SQL metodumuza geçiliyor.
String sql = "select * from Student order by maxOf(marks) desc";
SqlQuery<Integer, Student> query = new SqlQuery<>(Student.class, sql);
List<Student> result = cache.query(query).getAll().stream().map(e -> e.getValue())
  .collect(Collectors.toList());
setWriteThrough metodu
setWriteBehindEnabled() ile bellekteki veri veri tabanına asenkron yazılır
setWriteThrough() ile bellekteki değişiklik veri tabanına yansıtılır
setReadThrough() ile bellekte veri yoksa veri tabanına doldurulur

Örnek
Açıklaması şöyle
The most important thing here is a cache configuration (1). 
We should add primary key and entity classes as indexed types (2). 
Then, we have to enable export cache updates to the database (3) 
and read data not found in a cache from the database (4). 
The interaction between Ignite’s node and MySQL may be configured using the CacheJdbcPojoStoreFactory class (5). 
We should pass there DataSource@Bean (6), 
dialect (7), 
and mapping between object fields and table columns (8).
SQL cümlesi şöyle. Sütunlar JdbcType + JdbcTypeField ile kullanılacak
CREATE TABLE `contact` (
  `id` int(11) NOT NULL,
  `location` varchar(45) DEFAULT NULL,
  `contact_type` varchar(10) DEFAULT NULL,
  `person_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
);
Şöyle yaparız
IgniteConfiguration igniteCfg = ...

CacheConfiguration<Long, Person> personConfig =...
//(1)
CacheConfiguration<Long, Contact> contactConfig = new CacheConfiguration<>("ContactCache");
contactConfig.setIndexedTypes(Long.class, Contact.class); // (2)
contactConfig.setWriteBehindEnabled(true);
contactConfig.setWriteThrough(true); // (3)
contactConfig.setReadThrough(true); // (4)
//5
CacheJdbcPojoStoreFactory<Long, Contact> pojoFactory = new CacheJdbcPojoStoreFactory<>();
pojoFactory.setDataSource(datasource); // (6)
pojoFactory.setDialect(new MySQLDialect()); // (7)


JdbcType jdbcContactType = new JdbcType(); // (8)
jdbcContactType.setCacheName("ContactCache");
jdbcContactType.setKeyType(Long.class);
jdbcContactType.setValueType(Contact.class);
jdbcContactType.setDatabaseTable("contact");
jdbcContactType.setDatabaseSchema("ignite");

jdbcContactType.setKeyFields(new JdbcTypeField(Types.INTEGER, "id", Long.class, "id"));

jdbcContactType.setValueFields(
  new JdbcTypeField(Types.VARCHAR, "contact_type", ContactType.class, "type"), 
  new JdbcTypeField(Types.VARCHAR, "location", String.class, "location"), 
  new JdbcTypeField(Types.INTEGER, "person_id", Long.class, "personId"));
pojoFactory.setTypes(jdbcContactType);
contactConfig.setCacheStoreFactory(pojoFactory);


igniteCfg.setCacheConfiguration(personConfig, contactConfig);
Ignite ignite = Ignition.start(cfg);

Hiç yorum yok:

Yorum Gönder

Ignite Transaction Kullanımı

Giriş Bir tablo 3 tane atomicity değerinden birisine sahip olabilir. 1. ATOMIC 2. TRANSACTIONAL 3. TRANSACTIONAL_SNAPSHOT ATOMIC Açıklaması ...