我已經構建了一個包含實現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集?如何查詢和獲取在這種情況下的數據?
非常感謝!