how read-through work in ignite

妖精的绣舞 提交于 2019-12-11 01:26:16

问题


my cache is empty so sql queries return null. The read-through means that if the cache is missed, then Ignite will automatically get down to the underlying db(or persistent store) to load the corresponding data.

If there are new data inserted into the underlying db table ,i have to down cache server to load the newly inserted data from the db table automatically or it will sync automatically ?

Is work same as Spring's @Cacheable or work differently.
It looks to me that the answer is no. Cache SQL query don't work as no data in cache but when i tried cache.get in i got following results :

case 1:

 System.out.println("data == " + cache.get(new PersonKey("Manish", "Singh")).getPhones());

result ==> data == 1235

case 2 :

PersonKey per = new PersonKey();
per.setFirstname("Manish");
System.out.println("data == " + cache.get(per).getPhones());

throws error:- as following error image, image2


回答1:


Read-through semantics can be applied when there is a known set of keys to read. This is not the case with SQL, so in case your data is in an arbitrary 3rd party store (RDBMS, Cassandra, HBase, ...), you have to preload the data into memory prior to running queries.

However, Ignite provides native persistence storage [1] which eliminates this limitation. It allows to use any Ignite APIs without having anything in memory, and this includes SQL queries as well. Data will be fetched into memory on demand while you're using it.

[1] https://apacheignite.readme.io/docs/distributed-persistent-store




回答2:


When you insert something into the database and it is not in the cache yet, then get operations will retrieve missing values from DB if readThrough is enabled and CacheStore is configured.

But currently it doesn't work this way for SQL queries executed on cache. You should call loadCache first, then values will appear in the cache and will be available for SQL.

When you perform your second get, the exact combination of name and lastname is sought in DB. It is converted into a CQL query containing lastname=null condition, and it fails, because lastname cannot be null.

UPD:

To get all records that have firstname column equal to 'Manish' you can first do loadCache with an appropriate predicate and then run an SQL query on cache.

cache.loadCache((k, v) -> v.lastname.equals("Manish"));

SqlFieldsQuery qry = new SqlFieldsQuery("select firstname, lastname from Person where firstname='Manish'");

try (FieldsQueryCursor<List<?>> cursor = cache.query(qry)) {
    for (List<?> row : cursor)
        System.out.println("firstname:" + row.get(0) + ", lastname:" + row.get(1));
}

Note that loadCache is a complex operation and requires to run over all records in the DB, so it shouldn't be called too often. You can provide null as a predicate, then all records will be loaded from the database.

Also to make SQL run fast on cache, you should mark firstname field as indexed in QueryEntity configuration.




回答3:


In your case 2, have you tried specifying lastname as well? By your stack trace it's evident that Cassandra expects it to be not null.



来源:https://stackoverflow.com/questions/46540606/how-read-through-work-in-ignite

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!