我已经构建了一个 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)通过上述设置,我可以使用 dll 进行正常的 mongoDB 操作,但由于我的应用程序需要不断更新 mongoDB 数据(接近实时,每秒高达数百),我收到错误(没有有效的副本集实例服务器发现)更新数据时。
2)只有服务器需要与 mongoDB 数据库对话。所以基本上我只需要一个到数据库的连接。所以我想将 mongo::DBClientReplicaSet con 声明为静态全局变量,并在类构造函数中连接到它。但似乎我做不到。我的应用程序根本无法运行。有了这个,我不断收到以下错误。
断言失败: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”,我该如何初始化副本集?在这种情况下,我该如何查询和获取数据?
提前非常感谢!