2016-12-28 76 views
0

我已經構建了一個包含實現mongoDB複製集操作的類的dll。這是該課程的總結。C++傳統驅動程序mongoDB複製類的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)使用上述設置,我可以使用dll執行正常的mongoDB操作,但由於我的應用程序需要不斷更新mongoDB數據(接近實時,高達幾百秒),更新數據時出現錯誤(找不到有效的複製服務器實例服務器)。

2)只有服務器需要與mongoDB數據庫交談。所以基本上我只需要一個連接到數據庫。所以我想將mongo :: DBClientReplicaSet con聲明爲靜態全局變量,並在類構造函數中將其連接到它。但似乎我做不到。我的應用程序根本無法運行。這樣,我不斷得到以下錯誤。

斷言失敗:PX = 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但它似乎我不能使用它,就這樣,我如何使用該文件並充分利用replicaset功能?如果我可以使用「dbclient_rs.h」,如何初始化relica集?如何查詢和獲取在這種情況下的數據?

非常感謝!

回答

0

Fo第二個問題,我想起了出現錯誤的原因:

在構建任何驅動程序對象或BSON之前,需要調用mongo :: client :: initialize。

但是,如何使全局定義成爲可能,我仍然需要一個解決方案。