Я построил DLL, которая включает в себя класс, реализующий операции репликации mongoDB. Вот краткое изложение класса.
#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. Так что в основном мне просто нужно одно соединение с базой данных. Поэтому я хочу объявить con mongo :: DBClientReplicaSet в качестве статической глобальной переменной и подключиться к ней в функции конструирования класса. Но казалось, что я не могу этого сделать. Мое приложение не может работать вообще. При этом я постоянно получаю следующую ошибку.
Ошибка подтверждения: px! = 0, файл C: \ Boost \ include \ boost-1_62 \ boost / 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) Последний вопрос, я заметил, что есть файл mongo / client / dbclient_rs.h «для репликации. Но, похоже, я не могу его использовать. При этом я получаю сообщение об ошибке для initialize () и курсора auto_ptr. Как я могу использовать файл и в полной мере использовать возможности репликационного набора? Как я могу инициализировать набор реликвий, если я могу использовать «dbclient_rs.h»? Как я могу запрашивать и получать данные в этом случае?
Заранее большое спасибо!
На вопрос № 2 я вспомнил причину ошибки:
Вам нужно вызвать mongo :: client :: initialize, прежде чем создавать какие-либо объекты драйвера или BSON в этом отношении.
Но как сделать это глобальное определение возможным, мне все еще нужно решение.
Других решений пока нет …