【问题标题】:Optimal Approach for Caching/Persistence for custom model自定义模型的缓存/持久性的最佳方法
【发布时间】:2020-03-12 04:34:39
【问题描述】:

我对 Ignite 还很陌生,正在尝试一下。我的用例是我有一个需要缓存/持久化的模型。它不是传统的 pojo 模型,而且我想保持存储和模型解耦。所以我不能在传统意义上使用它来注释 pojo 中的适当键/索引。并且需要能够对缓存的数据执行查询。

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

  1. 走完整的 SQL 路线,即使用 Batch Exec 通过 jdbc 创建 TABLE、INSERT、REMOVE、SELECT。

  2. 将其存储为 BinaryObject,即

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 但不包括查询。

更新,供可能遇到此问题的人使用。

尝试过二进制方法,它可以工作。参考链接确实使用了 pojo(不完全是我想要的)。但进一步看,重点是为 QueryEntity 设置一个 valueType,它不必是类名,只是在 put 期间创建对象期间将 value 映射回引用,在查询期间也是如此。

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");

【问题讨论】:

    标签: java ignite distributed-caching


    【解决方案1】:

    您可以将其存储为 BinaryObject,并且可以通过将某些字段指定为 map to SQL via QueryEntities 来获得有限的查询支持。

    然后,您可以通过像这样的查询来获取整个键/值

    SELECT _key, _val FROM pojo WHERE name = ?;
    

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

    【讨论】:

    • 试过这种方法。更新了原始帖子的详细信息。 BinaryObject 查询失败。我错过了什么吗?
    • 我的代码有问题,我已经更新了它,它工作正常。谢谢。
    【解决方案2】:

    您很可能需要通过 TestPojoId 定义一个具有亲和力并置的一对多关系表。看看sample

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

    【讨论】:

    • ScanQuery with keepBinary 可能不会。
    • 一对多?为什么,不知道我明白了。这将是每行/记录一个唯一的 ID。尝试使用带有更新代码的扫描。但它失败了“class org.apache.ignite.IgniteCheckedException:查询执行失败:GridCacheQueryBean”。
    猜你喜欢
    • 2010-09-29
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多