2016-12-28 4 views
0

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

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

ответ

0

Fo r вопрос № 2, я вспомнил причину ошибки:

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

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