gpt4 book ai didi

java - Cassandra:从 Row 复制到 BoundStatement

转载 作者:行者123 更新时间:2023-11-29 04:20:41 25 4
gpt4 key购买 nike

我正在尝试编写一个通用工具,用于将 Cassandra 表内容从一个键空间复制到另一个键空间(可能在不同的集群中)。所有的 table 都不太大。

这是我的做法:

Session source = ...
Session destination = ...
TableMetadata table = ...

final ResultSet rs = source.execute("select * from " + table.getName());
String insertCql = ...
PreparedStatement preparedStatement = destination.prepare(insertCql);

for (Row row : rs) {
final BoundStatement boundStatement = preparedStatement.bind();

for (int i = 0; i < rs.getColumnDefinitions().size(); i++) {
// bind column value from row to bountStatement
}

session.execute(boundStatement);
}

问题是如何将列值从row 复制到boundStatement。我可以用row.getObject(i)读取它,但是在BoundStatement中没有相应的setObject()

更准确地说,此方法存在于驱动程序的 2.2 版中(它是 cassandra-driver-dse),但该版本不适用于 Cassandra 3,并且在驱动程序的版本 3 中(cassandra-driver-core) setObject() 方法不存在。相反,有一堆 set() 方法,它们都需要 ClassTypeTokenTypeCodec

我在哪里可以买到这些? ColumnDefinition 只给我 DataType。使用 row.getObject(i).getClass() 获取 Class 似乎是一个值得怀疑的想法。

也许有更好的方法来完成这项任务(模式不可知复制)?

我可以查看 DataType if 列并为每种类型创建一个案例以使用 setString() 等等,但这似乎有点过于复杂和脆弱。

最佳答案

您需要在插入语句中使用绑定(bind)变量,然后将准备好的语句与结果中的列值绑定(bind)。类似的东西:

String insertCql = "INSERT INTO ks.tb (...) values (?,?,...)";
for (Row row : rs) {
List bindVariables = new ArrayList();
for (int i = 0; i < rs.getColumnDefinitions().size(); i++) {
bindVariables.add(rs.getObject(i));
}
final BoundStatement boundStatement = preparedStatement.bind(bindVariables.toArray(new Object[0]));
session.execute(boundStatement);
}

关于java - Cassandra:从 Row 复制到 BoundStatement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49402424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com