Я построил dll, который включает в себя класс, реализующий операции репликации mongoDB. Вот краткое описание этого класса.C++ Legacy Driver mongoDB Replicaset в классе DLL
#include "mongo/client/dbclient.h"
mongoimp::mongoimp() {
mongo::client::initialize();
}
mongoimp::~mongoimp() {
mongo::client::shutdown();
}
int mongoimp::queryTRecords() {
string errmsg;
vector<mongo::HostAndPort> hosts = { mongo::HostAndPort("xx-a0.yyyy.com:xxxxx"), mongo::HostAndPort("xx-a1.yyyy.com:xxxxx") };
static mongo::DBClientReplicaSet con("xx", hosts, 0);
con.connect();
con.auth("dbname", "username", "password", errmsg);
auto_ptr<DBClientCursor> cursor = con.query("dbname.t", BSONObj());
BSONObj response;
con.logout("xx", response);
if (cursor->more()) {
BSONObj recordnm = cursor->nextSafe();
return(recordnm.getIntField("lastid"));
} else return(-1);
}
Приведенный выше код работает. Но вот мои вопросы:
1) С приведенной выше настройкой я могу выполнять нормальные операции mongoDB с dll, но поскольку моему приложению необходимо постоянно обновлять данные mongoDB (близко к реальному времени, до сотен в секунду) При обновлении данных я получаю ошибку (не найдены действительные серверы экземпляров replicaset).
2) Только серверу необходимо поговорить с базой данных mongoDB. Поэтому в основном мне просто нужно одно соединение с базой данных. Поэтому я хочу объявить mongo :: DBClientReplicaSet con как статическую глобальную переменную и подключиться к ней в функции построения класса. Но, похоже, я не могу этого сделать. Мое приложение не может работать вообще. При этом я постоянно получаю следующую ошибку.
Assertion не удалось: рх = 0, файл C: \ подталкивания \ включить \ подталкивание-1_62 \ наддува/smart_ptr/scoped_ptr.hpp, строка 105
Кто-нибудь знает, как решить эту проблему?
Ниже приведен код, я попробовал:..
static mongo::DBClientReplicaSet con("xx", { mongo::HostAndPort("xx-a0.yyyy.com:xxxxx"), mongo::HostAndPort("xx-a1.yyyy.com:xxxxx") }, 0);
mongoimp::mongoimp() {
mongo::client::initialize();
string errmsg;
con.connect();
con.auth("dbname", "username", "password", errmsg);
}
mongoimp::~mongoimp() {
BSONObj response;
con.logout("xx", response);
mongo::client::shutdown();
}
int mongoimp::queryTRecords() {
auto_ptr<DBClientCursor> cursor = con.query("dbname.t", BSONObj());
if (cursor->more()) {
BSONObj recordnm = cursor->nextSafe();
return(recordnm.getIntField("lastid"));
} else return(-1);
}
3) Последний вопрос, я заметил, есть/файл Монго/клиент dbclient_rs.h»для replicaset Но казалось, что я не могу использовать его с того, Я получаю ошибку для курсора initialize() и auto_ptr.Как я могу использовать файл и в полной мере использовать возможности репликации? Как инициализировать набор реплик, если я могу использовать «dbclient_rs.h»? Как мне выполнить запрос и выборку данные в этом случае?
Большое спасибо заранее!