這個版本仍然沒有解決不能編譯動態庫的問題,MongoDB這幫人發什麼神經?
原來兩個繞過的方法也不行了。
只有使用靜態庫了。
下載最新版的代碼,編譯
scons --prefix=/usr install
舊版的C++代碼會編譯報錯,因為ScopedDbConnection的建構函式變成了私人,必須通過靜態方法來建立。
所以調用代碼要做相應調整。
我的CMake工程配置如下:
target_link_libraries(service ${Boost_LIBRARIES} booster loki cryptopp mongoclient)
應該沒有問題了。
分享一下我的C++封裝類:
#ifndef BUSINESS_UTIL_MONGO_SESSION_H_#define BUSINESS_UTIL_MONGO_SESSION_H_#include <string>#include <memory>#include <mongo/client/connpool.h>using std::string;class MongoSession { public: /** * 從串連池中擷取串連,如果沒有則建立一個 */ MongoSession(string const& host, double socketTimeout=0); /** * 歸還串連到池中 */ ~MongoSession(); /** * 返回已經獲得的串連 */ mongo::DBClientBase& GetDBClientBase(); private: std::auto_ptr<mongo::ScopedDbConnection> con_;};#endif
#include "business/util/mongo_session.h"using namespace mongo;MongoSession::MongoSession(string const& host, double socketTimeout): con_(mongo::ScopedDbConnection::getScopedDbConnection(host, socketTimeout)) {}MongoSession::~MongoSession() { con_->done();}DBClientBase& MongoSession::GetDBClientBase() { return con_->conn();}
使用方法很簡單:
shared_ptr<MongoSession> mongoSession = MongoSessionFactory::GetSession(); BSONObjBuilder condition; condition.append("address", address); mongo::Query query_condition(condition.obj()); BSONObj result = mongoSession->GetDBClientBase().findOne("your_collection", query_condition); return !result.isEmpty();