在架构中添加一对列后,我想通过select *
选择它们。相反,select *
会返回旧的列集,而不会返回新的列。
通过文档推荐,我使用{prepare:true}来平滑JavaScript浮点数和Cassandra整数/ bigints差异(我真的不需要这里准备好的语句,只是为了解决这个问题ResponseError : Expected 4 or 0 byte int问题,我也不想打扰query hints
}。
因此,在第一次执行select *
时,我有3列。在此之后,我向架构添加了2列。 select *
如果与{prepare: true}
一起使用,则仍然会返回3列,如果没有它,则会返回5列。
我希望有一种方法来可靠地刷新此缓存或在每个应用程序启动时生成cassandra驱动程序准备语句。
我不会考虑以可靠的方式重新启动数据库群集。
答案 0 :(得分:5)
这实际上是Cassandra中的一个问题,已在2.1.3(CASSANDRA-7910)中修复。问题是在架构更新时,准备好的语句不会从Cassandra端的缓存中逐出。如果您运行的版本低于2.1.3(这可能是自上周发布的2.1.3以来),除非您创建另一个稍有不同的单独预准备语句,否则实际上没有办法解决此问题(如额外的空格或某些东西导致单独的独特陈述。)
当使用2.1.3运行并更改表模式时,C *将正确地从缓存中逐出相关的预准备语句,当驱动程序使用该语句发送另一个查询时,Cassandra将以“UNPREPARED”##进行响应39;消息,它应该激发nodejs驱动程序重新映射查询并为您重新发送请求。
在Node.js驱动程序上,您可以programatically clear the prepared statement metadata:
client.metadata.clearPrepared();