У меня есть поле DEV, из которого я пытаюсь подключиться к моим серверам STAGING Cassandra на порту 9042, поскольку я использую новый бинарный протокол. Я запускаю свой C++ код из окна DEV, используя libcql library
для Cassandra..
Но каким-то образом, я думаю, я могу установить соединение с моими промежуточными серверами Cassandra на порту 9042, поскольку Connected Successfully
будет распечатано.
Ниже приведен код, который у меня есть в моих заголовочных файлах -
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. Как только я изменил информацию о кассандре на локальную машину, она начинает работать нормально...
Я также проверил, что порты (9042) открыты нормально.. Тогда почему запрос подвешивается?
Я предполагаю, могут быть некоторые изменения, которые мне нужно сделать в методе execute_query
чтобы заставить его работать?
Версия Cassandra, которую я запускаю на промежуточных серверах, составляет 1.2.9, а локально - 1.2.8
Обновить:-
Я провел некоторое исследование, и эта строка не возвращает мне ничего, что означает, что future.get не работает нормально каким-то образом..
result = &*future.get().result;
после того, как он попытается выполнить мой запрос CQL Select. USE profileks
работает отлично, но только запрос CQL Select подвешивается.
Вы пытались запустить тот же запрос из CQLsh? Я думаю, что ваш запрос - это время, возможно, из-за большого количества возвращенных строк, возможно, если вы добавите ограничение X, это поможет. Если вы хотите получить все данные с помощью "SELECT * FROM mycolumnfamily", вы можете просмотреть свою архитектуру данных. Взгляните на документацию SELECT http://cassandra.apache.org/doc/cql/CQL.html#SELECT Также из документации. При использовании диапазона иногда полезно ограничить количество столбцов, которые могут быть возвращены как часть каждой строки (поскольку Cassandra является схематичной, необязательно заранее определить, сколько столбцов будет в наборе результатов). Для этого используйте предложение FIRST с целым числом, чтобы указать верхний предел количества столбцов, возвращаемых в строке. Предел по умолчанию - 10 000 столбцов. '
Я столкнулся с чем-то смутно похожим. Результат future.get() всегда имел нулевые указатели для одного и того же кода, который работал в другом месте. Я проследил его до опции командной строки g++:
скомпилировать с "g++ -std = gnu ++ 0x...", и он не скомпилируется с "g++...", и он работает