【问题标题】:Batch insertion using object mapper in Cassandra在 Cassandra 中使用对象映射器进行批量插入
【发布时间】:2016-06-26 06:39:27
【问题描述】:

使用 cassandra 对象映射器 api 想做一个批量持久化。

对于单个对象,它工作正常。

Mapper<MyObj> mapper = new MappingManager(getSession()).mapper(MyObj.class);
mapper.save(myObj);

我尝试以这种方式进行批量更新,但理想情况下,Cassandra 认为我正在保留一个列表,因此它会给出异常,例如在 List 中找不到 @Table 注释,这是预期的行为

Mapper<List<MyObj>> mapper = new MappingManager(getSession()).mapper(List.class);
myObjList.add(myObj1)
myObjList.addd(myObj2)
mapper.save(myObjList);

有没有办法在 cassandra 中使用批处理实现同样的效果?

注意:或者,我可以通过使用 for 循环重复第一步来做到这一点,但我正在寻找批量插入 @ObjectMapper。

【问题讨论】:

    标签: java cassandra datastax nosql


    【解决方案1】:

    这是我想从上述线程中的@adutra 讨论中总结的 sn-p。

    您可以利用 cassandra-core 驱动程序附带的 BatchStatement,它与 cassandra-mapper 非常兼容。

    Mapper<MyObj> mapper = new MappingManager(getSession()).mapper(MyObj.class);
    BatchStatement batch = new BatchStatement();
    batch.add(mapper.saveQuery(myObj1));
    batch.add(mapper.saveQuery(myObj2));
    session.execute(batch);
    

    【讨论】:

    • 并且要真正完整:我最初没有将您引导到BatchStatement 选项的原因是因为批处理查询不一定是最佳选择,有时单独/并行执行每个语句可以更快:请参阅this blog post 了解更多信息。
    【解决方案2】:

    Datastax 对象映射器框架中没有批量插入实用程序。

    您可以按照您的建议在 for 循环中一一插入实体,或者寻找更高级的映射框架,例如 Achilles

    【讨论】:

    • 或者你可以使用 PreparedStatement 就像这个主题建议的那样:stackoverflow.com/questions/19202812/…
    • @nukie 你是对的,但我正在寻找对象映射器解决方案。
    • @adutra 用于批处理的单个/常见功能,将所有跟腱库一起导入没有意义。如果可能的话,您能否使用对象映射器添加积压以支持批处理功能。
    • 其实这个功能已经被请求了,见JAVA-706。您不需要映射器中的任何特殊内容来创建BatchStatement,如果您想要这样做,请参阅该票证中的评论以获取示例。
    猜你喜欢
    • 2016-05-07
    • 2016-12-16
    • 2019-09-22
    • 2014-04-13
    • 1970-01-01
    • 2011-07-03
    • 2016-05-16
    • 2020-01-17
    • 2021-11-12
    相关资源
    最近更新 更多