我可以像C / C ++驱动程序一样强制执行Cassandra表刷新吗?

时间:2016-04-19 21:47:47

标签: c++ cassandra driver cassandra-3.0

我想知道是否可以从Cassandra的C / C ++驱动程序复制nodetool实用程序中的forceKeyspaceFlush()函数。

nodetool函数如下所示:

public class Flush extends NodeToolCmd
{
    @Arguments(usage = "[<keyspace> <tables>...]", description = "The keyspace followed by one or many tables")
    private List<String> args = new ArrayList<>();

    @Override
    public void execute(NodeProbe probe)
    {
        List<String> keyspaces = parseOptionalKeyspace(args, probe);
        String[] tableNames = parseOptionalTables(args);

        for (String keyspace : keyspaces)
        {
            try
            {
                probe.forceKeyspaceFlush(keyspace, tableNames);
            } catch (Exception e)
            {
                throw new RuntimeException("Error occurred during flushing", e);
            }
        }
    }
}

我想在我的C ++软件中复制的是这一行:

probe.forceKeyspaceFlush(keyspace, tableNames);

有可能吗?

1 个答案:

答案 0 :(得分:2)

这是一个不寻常的请求,主要是因为Cassandra被设计为分布式的,因此如果您正在执行查询,则需要在每个(可能很多)副本上执行阻塞刷新。我没有说服你确实不需要这个,而是试图回答你的问题 - 但是,你可能并不真的需要这个。

Nodetool正在使用JMX接口(在tcp / 7199上)强制刷新 - 您的c / c ++驱动程序通过本机协议进行通信(在tcp / 9042上)。目前,无法通过the native protocol刷新。

解决这个限制,你需要执行一个支持jmx的命令行实用程序(nodetool或其他),用c ++实现一个JMX客户端(它已经完成),或者扩展本机协议。这些都不是特别令人愉快的选择,但我认为执行jmx CLI实用程序要比其他两个实用程序容易得多。