我有一个 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 查询被挂起..