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" を使用できる場合、レプリカ セットを初期化するにはどうすればよいですか? その場合、データのクエリとフェッチを行うにはどうすればよいですか?
よろしくお願いします!