0

我有一个 DEV 盒,我正在尝试连接到端口 9042 上的 STAGING Cassandra 服务器,因为我正在使用新的二进制协议。我正在使用libcql library用于 Cassandra 的 DEV 框运行我的 C++ 代码。

Connected Successfully但不知何故,我想,当打印出来时,我可以连接到端口 9042 上的暂存 Cassandra 服务器。

以下是我在头文件中的代码 -

static cql_client_t* client;
shared_future<cql_future_connection_t> connect_future;

const string server = "sc-host01.vip.slc.qa.host.com"; //"localhost";


//Open the connection
void connection_open() {
    connect_future = client->connect(server, 9042);

    cout<<"Connected Successfully"<< endl;
    connect_future.wait();
}

//Execute a Query
cql_result_t& execute_query(string query) {
    bool error = false;
    cql_result_t* result=NULL;
    try{
        if (!connect_future.get().error.is_err()) {
            cout << "query " << query << endl;
            shared_future<cql_future_result_t> future = client->query(query,CQL_CONSISTENCY_ONE);
            future.wait();
            error = future.get().error.is_err();
            result = &*future.get().result;
        } else{
            cout << "Query status... " << (!error ? "true" : "false") << std::endl;
        }
    }catch (int e){
        cout << "An exception occurred when executing query. " << e << endl;
    }
    return *result;
}

#endif

下面是我的代码.cc file,它将尝试使用上面的类建立连接。然后也执行查询。

/**
 * This method will retrieve the data from Cassandra..
 * And then call print_rows method to print it out on the console
 */
void get_attributes(string id){
    try{

        // some code

        cout << "id " << id << endl;

        //Connection open
        connection_open();

        execute_query("USE profileks;");

        //this will give me the result back of the select query
        cql_result_t& result = execute_query("select * from profile_user where key ='"+id+"';");

        // and this is printing it out on the console
        print_rows(result);

        // some code
    } catch (int e){
        // some code here
    }
}

现在我面临的问题是它没有返回任何结果。它以某种方式挂在选择查询上 -

这是我在控制台上看到的 -

id 1
Connected Successfully
query USE profileks;
query select record_name, record_value from user_data where user_id ='1';

之后它被挂起,这意味着它没有返回我的任何结果......但是相同的代码适用于我的本地 cassandra 服务器。一旦我将登台 cassandra 信息更改为本地机器,它就开始正常工作......

我还检查了端口(9042)是否打开正常。那么为什么查询被挂起?

我假设,我可能需要对execute_query方法进行一些更改才能使其正常工作?

我在暂存服务器上运行的 Cassandra 版本是 1.2.9,本地是 1.2.8

更新:-

我做了一些研究,这条线并没有给我任何回报——这意味着 future.get 以某种方式无法正常工作..

result = &*future.get().result;

在它尝试执行我的 CQL Select 查询之后..USE profileks工作正常但只有 CQL Select 查询被挂起..

4

2 回答 2

0

我遇到了类似的事情。future.get().result 对于在其他地方工作的完全相同的代码总是有空指针。我将其追溯到 g++ 命令行选项:

用“g++ -std=gnu++0x ...”编译,用“g++ ...”编译失败,它可以工作

于 2013-12-27T21:55:48.307 回答
0

您是否尝试从 CQLsh 运行相同的查询?我认为您的查询是计时的,可能是因为返回了大量行,也许如果您添加限制 X,它会有所帮助。如果您打算使用“SELECT * FROM mycolumnfamily”获取所有数据,您可能需要查看您的数据架构。查看 SELECT 文档http://cassandra.apache.org/doc/cql/CQL.html#SELECT 也来自文档“使用范围时,有时限制可以返回的列数很有用作为每一行的一部分(由于 Cassandra 是无模式的,因此不一定可以提前确定结果集中有多少列)。为此,请使用带整数的 FIRST 子句来指定每行返回的列数的上限。默认限制为 10,000 列。

于 2013-10-14T11:09:48.607 回答