【问题标题】:Cassandra nodejs DataStax driver don't return newly added columns via prepared statement executionCassandra nodejs DataStax 驱动程序不会通过准备好的语句执行返回新添加的列
【发布时间】:2015-04-30 22:03:12
【问题描述】:

在架构中添加一对列后,我想通过select * 选择它们。取而代之的是 select * 返回一组旧的列而不是新的。

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

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

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

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

【问题讨论】:

标签: node.js cassandra prepared-statement


【解决方案1】:

这实际上是 Cassandra 中的一个问题,已在 2.1.3 (CASSANDRA-7910) 中修复。问题是在模式更新时,准备好的语句不会从 Cassandra 端的缓存中逐出。如果您运行的版本低于 2.1.3(可能自上周发布 2.1.3 以来),除非您创建另一个略有不同的单独准备好的语句(如额外空格或其他东西导致单独的唯一声明)。

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

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

client.metadata.clearPrepared(); 

【讨论】:

    猜你喜欢
    • 2013-07-03
    • 2013-05-31
    • 2015-06-23
    • 2017-11-05
    • 2015-04-30
    • 1970-01-01
    • 2016-07-16
    • 2013-07-10
    • 2016-04-29
    相关资源
    最近更新 更多