自定义模型 Caching/Persistence 的最佳方法

Optimal Approach for Caching/Persistence for custom model

我对 Ignite 还很陌生,正在试用。我的用例是我有一个需要 cached/persisted 的模型。这不是传统的 pojo 模型,而且我想保持存储和模型分离。所以我不能在传统意义上使用它,在 pojo 中注释适当的 keys/indexes。并且需要能够对缓存数据执行查询。

到目前为止,根据我所阅读的内容和我的用例,我看到的唯一选择是:

  1. 完成 SQL 路线,即使用 Batch Exec 通过 jdbc 创建 TABLE、插入、删除、SELECT。

  2. 将其存储为二进制对象,即

IgniteCache<BinaryObject, BinaryObject>

但是有了这个,我不确定我是否可以获得查询支持。因为它将存储为 blob/byte[].

所以我正在寻找的是,还有其他我可能错过的选择吗? 对于 #1,有没有办法使用 jdbc/SQL 和锁定,因为我使用的是 atomicity=transactional.

对于 #2,有什么方法可以向它添加查询支持。我看了 https://github.com/dmagda/ignite_world_demo/blob/master/src/main/java/demo/keyvalue/KeyValueBinaryDataProcessing.java 但不包括查询。

更新 给可能 运行 的人。

尝试过二进制方法,它有效。参考 link 确实使用了 pojo(不完全是我想要的)。但进一步看,要点是为 QueryEntity 设置一个 valueType,它不需要是一个 class 名称,只需将值映射到在 put 和查询期间类似地创建对象期间返回引用。

queryEntity.setValueType("employee");

//this can be now referenced while creating an object
ignite.binary().builder("employee");

// similarly used while querying
SqlFieldsQuery sqlQuery = new SqlFieldsQuery("select * from employee");

您很可能需要通过 TestPojoId 定义一对多关系 table 和亲缘关系。看看 sample.

ScanQueries 可以在没有模式定义的情况下使用,但需要完整的对象反序列化。

您可以将其存储为 BinaryObject,并且可以通过将某些字段指定为 map to SQL via QueryEntities.

来限制查询支持

然后,你可以通过像

这样的查询得到整个key/value
SELECT _key, _val FROM pojo WHERE name = ?;

请注意,您需要使用 Native SQL API,JDBC 不行。