gpt4 book ai didi

c++ - Qt 应用程序中的 MongoDB C++ 驱动程序稳定分支崩溃

转载 作者:行者123 更新时间:2023-11-30 05:05:48 25 4
gpt4 key购买 nike

我正在使用 Qt 5.7.0 和 MSVC 2015 64 位编译器开发 Web 应用程序。我使用 Qt Creator 作为 IDE。我设法构建了 mongoc、mongocxx 和 bsoncxx 库并将其与系统链接起来。这些库是在 Release模式下构建的,具有与 Qt Web 应用程序相同的编译器和运行时。我使用了 1.9.0 版的 C 驱动程序和 3.1 版的稳定 C++ 驱动程序。驱动程序是根据 MongoDB 提供的说明和标准设置构建的。我只将两个驱动程序的发行版本与我的应用程序链接起来。

在我的应用程序的调试版本中,一切正常。但是,在 Web 应用程序的发布版本中,我设法在应用程序的主线程中创建了一个实例和连接池,但是当我尝试在子线程中从该池中获取连接时,系统崩溃了。下面的代码示例中指出了崩溃的确切位置。

我不确定这是驱动程序中的错误还是我的多线程代码中的错误,因此我在下面包含了相关的代码片段。 MongoPool 对象是在主线程中创建的。当收到新的用户请求时,在子线程中创建 MongoConnector 对象。请注意,我已按照评论中的要求尽可能地减少了代码。任何希望收到完整应用程序代码的人,请与我联系,我很乐意为您提供。

The error message and stack trace

The stack trace

main.cpp

#include "mongopool.h"

MongoPool *pool;

int main(int argc, char *argv[])
{
QCoreApplication app(argc,argv);

// Initialize MongoDB
pool = new MongoPool();

app.exec();
}

#include "mongoconnector.h"

extern MongoPool *pool;

MongoConnector::MongoConnector()
{
}

bool MongoConnector::storeDocument(QString dbName,
QString collectionName,
QString docID,
QString doc)
{

try {
std::cout << "Creating database connection" << "\n";

mongocxx::pool::entry client = pool->get_connection();
if(!client)
{
std::cout << "No Connection!";
}

std::cout << "Obtaining database and collection" << "\n";

// HERE THE CRASH HAPPENS!!!
mongocxx::database dataDB = client->database(dbName.toLatin1().toStdString());
mongocxx::collection dataCollection = dataDB[collectionName.toLatin1().toStdString()];
// ....

} catch (const std::exception& xcp) {
std::cout << "connection failed: " << xcp.what() << "\n";
}

return true;
}

#include "mongopool.h"

// INCLUDE STATEMENTS ARE OMITTED FOR MONGOCXX AND BSONCXX

class MongoConnector
{
public:
MongoConnector();

bool storeDocument(QString dbName,
QString collectionName,
QString docID,
QString doc);
};

#include "mongopool.h"

MongoPool::MongoPool()
{
using bsoncxx::builder::stream::document;

auto uri = mongocxx::uri{mongocxx::uri::k_default_uri};
configure(std::move(uri));

try {
mongocxx::pool::entry client = get_connection();

auto admin = client->database("admin");

document ismaster;
ismaster << "isMaster" << 1;

auto result = admin.run_command(ismaster.view());

} catch (const std::exception& xcp) {
std::cout << "connection failed: " << xcp.what() << "\n";
}
}

void MongoPool::configure(mongocxx::uri uri) {
class noop_logger : public mongocxx::logger {
public:
virtual void operator()(mongocxx::log_level, mongocxx::stdx::string_view,
mongocxx::stdx::string_view) noexcept {
}
};

auto instance =
mongocxx::stdx::make_unique<mongocxx::instance>(mongocxx::stdx::make_unique<noop_logger>());

configure(std::move(instance),
mongocxx::stdx::make_unique<mongocxx::pool>(std::move(uri)));
}

void MongoPool::configure(std::unique_ptr<mongocxx::instance> instance,
std::unique_ptr<mongocxx::pool> pool) {
_instance = std::move(instance);
_pool = std::move(pool);
}

mongocxx::pool::entry MongoPool::get_connection() {
return _pool->acquire();
}

mongocxx::stdx::optional<mongocxx::pool::entry> MongoPool::try_get_connection() {
return _pool->try_acquire();
}

// INCLUDE STATEMENTS ARE OMITTED FOR MONGOCXX AND BSONCXX

class MongoPool
{
public:
MongoPool();

void configure(mongocxx::uri uri);
void configure(std::unique_ptr<mongocxx::instance> instance,
std::unique_ptr<mongocxx::pool> pool);
mongocxx::pool::entry get_connection();
mongocxx::stdx::optional<mongocxx::pool::entry> try_get_connection();

private:
std::unique_ptr<mongocxx::instance> _instance;
std::unique_ptr<mongocxx::pool> _pool;

};

最佳答案

查看堆栈跟踪图像和 mongocxx 驱动程序代码后,如果客户端无效,以下代码仅打印“无连接”但不返回 false(或断言或退出),这是您应该做的

if(!client)
{
std::cout << "No Connection!";
}

很明显,在这一行 mongocxx::database dataDB = client->database(dbName.toLatin1().toStdString()); if client是一个无效的指针那么你会得到一个崩溃

此外,基于示例(第 35 行 https://github.com/mongodb/mongo-cxx-driver/blob/master/examples/mongocxx/mongodb.com/usage_overview.cpp)最好把它写成mongocxx::database dataDB = (*client)[dbName.toLatin1().toStdString()];

关于c++ - Qt 应用程序中的 MongoDB C++ 驱动程序稳定分支崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48215337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com