У меня есть устройство DEV, из которого я пытаюсь подключиться к своим серверам STAGING Cassandra через порт 9042, поскольку я использую новый двоичный протокол. Я запускаю свой код C ++ из коробки DEV, используя libcql library
для Кассандры ..
Но почему-то, я думаю, я могу подключиться к моим промежуточным серверам 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';
И после этого он зависает, что означает, что он не возвращает никакого результата назад … Но тот же код отлично работает для моего локального сервера Кассандры. Как только я изменил информацию кассовой постановки на локальную машину, она начинает работать нормально …
Я также проверил порты (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 (). result всегда были нулевые указатели для того же самого кода, который работал в другом месте. Я проследил это до опции командной строки g ++:
скомпилировать с «g ++ -std = gnu ++ 0x …», и это не удается
скомпилировать с «g ++ …» и все работает