Cassandra nodejs DataStax驱动程序不会通过准备好的语句执行返回新添加的列

在模式中添加一对列后,我想通过select *select它们。 相反, select *返回旧的一组列,并没有新的。

通过文档build议,我使用{prepare:true}来平滑JavaScript浮点数和Cassandra ints / bigints的区别(我并不真的需要准备好的语句,只是解决了这个ResponseError:期望的4或0字节的int问题,我也不想打扰自己的query hints )。

所以在第一次执行select *我有3列。 在此之后,我添加了2列到架构。 select *仍然返回3列,如果使用{prepare: true}和5列(如果没有使用它)。

我想有一个方法来可靠地刷新这个caching或使cassandra驱动程序准备在每个应用程序启动语句。

我不认为重新启动数据库集群是一个可靠的方法。

这实际上是在Cassandra 2.1.3( CASSANDRA-7910 )中修复的一个问题。 问题是在模式更新时,准备好的语句不会从Cassandra端的caching中被清除。 如果你运行的版本低于2.1.3(这可能是上周发布2.1.3以后的版本),除非你创build另外一个单独的准备好的语句,这个语句稍微有些不同(比如额外的空格或其他东西,导致一个单独的独特的声明)。

当使用2.1.3和更改表模式时,C *将正确地从caching中驱逐相关的预处理语句,当驱动程序使用该语句发送另一个查询时,Cassandra将以“UNPRREPARED”消息响应,这应该激发nodejs驱动程序代表查询并重新发送请求。

在Node.js驱动程序上,可以编程清除准备好的语句元数据 :

 client.metadata.clearPrepared();