如果给出CQLStatement,QueryState和QueryOptions,如何获取查询字符串

时间:2017-11-19 15:31:26

标签: cassandra cassandra-2.1

Cassandra有org.apache.cassandra.cql3.QueryHandler接口,它提供apis来处理来自客户端的外部查询。

在处理准备好的陈述的api下面:

public ResultMessage processPrepared(CQLStatement statement, QueryState state, QueryOptions options) throws RequestExecutionException, RequestValidationException;

如果给出了CQLStatement,QueryState和QueryOptions,我想记录queryString和传递给它的值。我怎么能得到它?

我相信一个参与过cassandra代码的人可以帮助我解决这个问题。

2 个答案:

答案 0 :(得分:1)

这在2.1中非常困难。对于更新版本的日志记录,他们需要这些,他们只需尽可能地重新创建它。您可以在ReadCommand实现中看到如何使用name()toCQLString()等慢速查询日志记录。你可以向后移植这个和appendCQLWhereClause的2个实现,以便能够做类似的事情,然后为修改语句构建一个。

getPrepared()中,您可以从ParsedStatement.Prepared获取rawCQLStatement并将其存储在本地线程中。

您可能还想考虑使用自定义跟踪实现(example)或使用触发器并构建变异记录器。

答案 1 :(得分:1)

执行以下操作:

  • 创建一个实现QueryHandler接口的类,让Cassandra意识到它
  • 在该类中,您可以维护一个查询列表(在调用prepare方法时添加到此列表中)以及当getPrepared它&#39时您将从列表中获取的当前查询被称为;您可以使用MD5Digest id
  • 从列表中获取它
  • 调用processPrepared时,您可以使用?中的值替换查询字符串中的QueryOptions options.getValues()

HTH