在Cassandra中使用对象映射器批量插入

lam*_*dar 4 java cassandra nosql datastax

使用cassandra对象映射器api想要进行批处理持久化.

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

Mapper<MyObj> mapper = new MappingManager(getSession()).mapper(MyObj.class);
mapper.save(myObj);
Run Code Online (Sandbox Code Playgroud)

对于批量更新我试过这种方式,但理想情况下Cassandra认为我持久化列表所以它给出了异常,就像在List中找不到@Table注释,这是预期的行为

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

有没有办法在使用批处理的cassandra中实现相同的功能?

注意:或者我可以通过使用for循环重复第一步来完成此操作,但我正在寻找批量插入@ObjectMapper.

lam*_*dar 8

以下是我想在上面的主题中总结@adutra讨论的片段.

你可以利用随附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);
Run Code Online (Sandbox Code Playgroud)

  • 且实际上是完整的:之所以我最初没有将您定向到`BatchStatement`选项的原因是因为批处理查询不一定是最佳选择,有时单独/并行执行每个语句会更快:请参阅[此博客帖子](https://lostechies.com/ryansvihla/2014/08/28/cassandra-batch-loading-without-the-batch-keyword/)了解更多信息。 (2认同)

adu*_*tra 3

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

您可以像您建议的那样将实体一一插入到 for 循环中,或者寻找更高级的映射框架,例如Achilles

  • 实际上,这个功能已经被请求,请参阅[JAVA-706](https://datastax-oss.atlassian.net/browse/JAVA-706)。如果您想要执行此操作,则不需要在映射器中执行任何特殊操作即可创建“BatchStatement”,请参阅该票证中的注释以获取示例。 (3认同)