【问题标题】:Use consistency level in Phantom-dsl and Cassandra在 Phantom-dsl 和 Cassandra 中使用一致性级别
【发布时间】:2019-04-12 21:20:03
【问题描述】:

目前正在使用--

cqlsh> show version
[cqlsh 4.1.1 | Cassandra 2.0.17 | CQL spec 3.1.1 | Thrift protocol 19.39.0]

使用 phantom-dsl 1.12.2 , Scala 2.10 ..

我不知道如何设置查询的一致性级别。

insert()select() 作为CassandraTable 的一部分有预定义函数。我怎样才能将一致性级别传递给它们?

insert.value(....).consistencyLevel_=(ConsistencyLevel.QUORUM)

不起作用并因错误而失败(可能是因为这在查询末尾附加了“使用一致性仲裁”)。这是我得到的实际异常

com.datastax.driver.core.exceptions.SyntaxError: line 1:424 no viable alternative at input 'CONSISTENCY'
at com.datastax.driver.core.Responses$Error.asException(Responses.java:122) ~[cassandra-driver-core-2.2.0-rc3.jar:na]
at com.datastax.driver.core.DefaultResultSetFuture.onSet(DefaultResultSetFuture.java:120) ~[cassandra-driver-core-2.2.0-rc3.jar:na]
at com.datastax.driver.core.RequestHandler.setFinalResult(RequestHandler.java:186) ~[cassandra-driver-core-2.2.0-rc3.jar:na]
at com.datastax.driver.core.RequestHandler.access$2300(RequestHandler.java:45) ~[cassandra-driver-core-2.2.0-rc3.jar:na]
at com.datastax.driver.core.RequestHandler$SpeculativeExecution.setFinalResult(RequestHandler.java:754) ~[cassandra-driver-core-2.2.0-rc3.jar:na]
at com.datastax.driver.core.RequestHandler$SpeculativeExecution.onSet(RequestHandler.java:576) ~[cassandra-driver-core-2.2.0-rc3.jar:na]

我从 this 拉取请求的文档和讨论中看到,我可以在 SimpleStatement 上执行 setConsistencyLevel(ConsistencyLevel.QUORUM),但我不希望重写所有不同的插入语句。

更新

只是为了结束这个问题。我通过创建自定义InsertQuery 然后使用它而不是final def insertCassandraTable 中提供的那个来解决这个问题

  def qinsert()(implicit keySpace: KeySpace) = {
     val table = this.asInstanceOf[T]
     new InsertQuery[T, M, Unspecified](table, CQLQuery("INSERT into keyspace.tablename", consistencyLevel = ConsistencyLevel.QUORUM)
  }

【问题讨论】:

    标签: scala cql3 phantom-dsl


    【解决方案1】:

    首先,幻象内部没有setValue 方法,并且您使用的API 方法最后缺少=

    正确的结构是:

    Table.insert .value(_.name, "test") .consistencyLevel_=(ConsistencyLevel.Quorum)

    当您在 stackoverflow 上时,错误堆栈跟踪和不起作用的具体细节通常比“不起作用”更可取。

    【讨论】:

    • 感谢您的回答!我使用.consistenceyLevel_=(ConsistencyLevel.QUORUM) 时收到的实际错误更新了问题
    • @Kal 这意味着虚拟版本控制逻辑可能无法充分考虑 Datastax 将其更改为一致性解析的那一刻。 Phantom 必须阅读 Cassandra 版本,然后在此基础上应用一致性,这就是问题所在。我会进一步看看这个。尽管这是经过测试并且有效的,2.0.17 似乎坏了。
    • 嗨@flavian -- 再次感谢。我已经能够将其范围缩小到基本上USING 不再是 CQL3 api 的一部分。如果我这样做session.newSimpleStatement(insert query).setConsistencyLevel,然后发出session.execute(..),它会起作用。此命令确实发生在 ExecutableQuery -- def statement() 类中,但似乎无论如何都没有覆盖 def consistencyLevel: Option[ConsistencyLevel]
    • @Kal 当您使用幻像方法时,幻像内部使用相同的session.newSimpleStatement 来设置级别,不知何故这失败了,但我们确实对此进行了测试。唯一可能出错的是我们在 Cassandra 版本中做得不够。测试看起来像:如果 Cassandra.Version 比 x 好,则执行此操作,否则执行此操作。希望这是有道理的,谢谢您的帮助!
    【解决方案2】:

    我终于想出了如何使用 phantom-dsl 正确设置一致性级别。

    使用语句可以执行以下操作:

    statement.setConsistencyLevel(ConsistencyLevel.QUORUM)
    

    另外,看看我一直在努力帮助像你这样的人使用 phantom-dsl 的示例的测试项目:

    https://github.com/iamthiago/cassandra-phantom

    【讨论】:

      猜你喜欢
      • 2018-06-13
      • 2016-07-05
      • 2016-04-10
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-09
      • 1970-01-01
      相关资源
      最近更新 更多