Устаревший драйвер C ++ mongoDB Replicaset в классе DLL

Я построил 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»? Как я могу запрашивать и получать данные в этом случае?

Заранее большое спасибо!

0

Решение

На вопрос № 2 я вспомнил причину ошибки:

Вам нужно вызвать mongo :: client :: initialize, прежде чем создавать какие-либо объекты драйвера или BSON в этом отношении.

Но как сделать это глобальное определение возможным, мне все еще нужно решение.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]