0

我已经构建了一个 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”,我该如何初始化副本集?在这种情况下,我该如何查询和获取数据?

提前非常感谢!

4

1 回答 1

0

对于第2个问题,我记住了错误的原因:

在构造任何驱动程序对象或 BSON 之前,您需要调用 mongo::client::initialize。

但是如何使这个全局定义成为可能,我仍然需要一个解决方案。

于 2016-12-29T00:20:56.047 回答