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

Cassandra nodejs DataStax driver don't return newly added columns via prepared statement execution

在架构中添加一对列后,我想通过 select * select 它们。相反 select * returns 旧的一组列和 none 新的。

根据文档推荐,我使用 {prepare: true} 来平滑 JavaScript 浮点数和 Cassandra ints/bigints 差异(我真的不需要这里的准备语句,它只是为了解决这个 ResponseError : Expected 4 or 0 byte int 问题,我也不想用 query hints) 来打扰自己。

所以在第一次执行 select * 时,我有 3 列。在此之后,我向模式添加了 2 列。 select * 仍然 returns 如果与 {prepare: true} 一起使用则为 3 列,如果不与它一起使用则为 5 列。

我想要一种方法来可靠地刷新此缓存或使 cassandra 驱动程序在每次应用程序启动时准备语句。

我不认为重启数据库集群是一种可靠的方式。

这实际上是 Cassandra 中的一个问题,已在 2.1.3 (CASSANDRA-7910) 中修复。问题是在模式更新时,准备好的语句不会从 Cassandra 端的缓存中逐出。如果您 运行 的版本低于 2.1.3(这很可能是因为上周发布了 2.1.3),除非您创建另一个单独的准备好的语句,否则确实没有办法解决这个问题不同(例如额外的空格或其他导致单独的唯一语句的内容)。

当 运行 2.1.3 和更改 table 架构时,C* 将从缓存中正确驱逐相关准备好的语句,并且当驱动程序使用该语句发送另一个查询时,Cassandra 将用 'UNPREPARED' 消息响应,这应该会激发 nodejs 驱动程序重新准备查询并为您重新发送请求。

在Node.js驱动上,你可以programatically clear the prepared statement metadata:

client.metadata.clearPrepared();