0

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 データを常に更新する必要があるため (リアルタイムに近く、1 秒あたり最大数百回)、エラーが発生します (有効なレプリカセット インスタンス サーバーがありません)。見つかった) データを更新するとき。

2) サーバーのみが mongoDB データベースと通信する必要があります。したがって、基本的には、データベースへの接続が 1 つだけ必要です。したがって、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) 最後の質問ですが、replicaset 用の mongo/client/dbclient_rs.h" ファイルがあることに気付きました。しかし、使用できないようです。そのため、initialize() および auto_ptr カーソルでエラーが発生しています。ファイルを使用するにはどうすればよいですか?また、レプリカセットの機能を最大限に活用するには? "dbclient_rs.h" を使用できる場合、レプリカ セットを初期化するにはどうすればよいですか? その場合、データのクエリとフェッチを行うにはどうすればよいですか?

よろしくお願いします!

4

1 に答える 1

0

質問 2 については、エラーの理由を思い出しました。

ドライバー オブジェクトを構築する前に、mongo::client::initialize を呼び出す必要があります。つまり、BSON を呼び出す必要があります。

しかし、そのグローバルな定義を可能にする方法については、まだ解決策が必要です。

于 2016-12-29T00:20:56.047 に答える