我在存储库类的构造函数中准备语句,如下所示
PreparedStatement getStatement = cqlSession.prepare(selectFrom("the_table")
.all()
.whereColumn("the_key").isEqualTo(bindMarker())
.build());
我稍后将其绑定到BoundStatement并读取如下结果
String someColumn = row.isNull("some_column") ? null : row.getString("some_column")
在运行时,我对表运行了一个alter,添加了一个列。由于我只按名称查询列,所以我期望的东西会起作用。但是,似乎驱动程序内部已经将列名Map到列索引,而这些索引现在都被破坏了。
这是预期的吗?它严重限制了在运行时可以做的事情。
我是否遗漏了一些内容,这些内容会迫使重新准备有关模式更改的语句?
我可以拦截它并手动重新准备吗?
我运行的是spring Boot 2.5.9和驱动程序版本4.11.3 cassandra集群运行的是版本3.11.10
2条答案
按热度按时间elcex8rz1#
谢谢你的提问!
你的症状听起来像CASSANDRA-10786中描述的行为。如果你正在处理Cassandra 4.0之前的版本,这很可能是正在发生的事情。
该问题中的描述是否与您看到的相符?
lh80um4z2#
为了补充@ abrudfarry的回答,Cassandra 3.7是一个非常老的版本,事实上,它的发布可以追溯到2016年初。
从那时起,有几个重要的修复预准备语句。虽然快速浏览这些修复似乎没有直接关系到您报告的问题,但它们仍然是重要的。
另外,在过去的6年里,有几个模式迁移/传播的修复。同样,它们与你的问题没有直接关系,我通常不愿意推动升级,但我认为6年来C* 3.7到3.11之间的修复值得。最新的值得。干杯!