Qt MySQL适配器拒绝随机连接:无法分配MYSQL

sor*_*h-r 11 c++ mysql qt qt5

我正在使用QMYSQL连接到本地数据库.该应用程序运行在多个线程上.每个线程使用独立连接连接到数据库.当我尝试连接数据库时,有时Qt会抛出以下错误.有什么问题?

QMYSQL: Unable to allocate a MYSQL object
Run Code Online (Sandbox Code Playgroud)

更新

添加了用于连接的代码.此对象被移动到一个线程,该连接被命名.critical是一个发送到主窗口的信号,用于在发生严重错误(显示消息)后终止应用程序执行.log是一个发出的信号,用于将事件记录到数据库中.

void ClientWorker::connect() {
    m_database = QSqlDatabase::addDatabase("QMYSQL","wsc");
    m_database.setHostName(m_host);
    m_database.setDatabaseName(m_databaseName);
    m_database.setPort(m_port);
    m_database.setUserName(m_db_username);
    m_database.setPassword(m_db_password);
    if(!m_database.open()) {
        QString error = "Unable to connect to database. Reason:\n";
        error+= m_database.lastError().text();
        log("Unable to connect to database! ", error, "ERROR" );
        emit critical(tr("Database Error!"),error);
    } else {
        log("Connected to datbase successfully.", "", "NOTICE" );
}
Run Code Online (Sandbox Code Playgroud)

更新2

我刚刚意识到,每次从主线程建立连接时(主踏板中没有活动连接),驱动程序都无法加载.我刚刚添加了一个小的虚拟连接代码,main()它连接并立即断开连接(在任何线程连接之前).添加该代码,一切正常.我不确定为什么线程在主线程中的连接之前无法连接,但我认为它看起来像一个bug.希望这有助于某人,花了3天时间:/

ecl*_*kso 9

您可能不关心上次更新后,但我有一个基于它的理论: 表明mysql_library_init()必须从main()多线程应用程序调用.

如果您查看Qt插件源代码,那么该方法将被包装qLibraryInit(),从QMYSQLDriver : QSqlDriver构造函数中调用,我相信这会addDatabase()在您的使用上下文中间接创建.

MySQL的文档指出,mysql_library_init()可以做一个互斥体,这将产生QtSql代码保护所有QSqlDriver建设,我不认为它的保护.所以我不确定这是否会被视为Qt代码错误或文档中的差距.

这一切都符合你所描述的行为,但我仍然怀疑自己 - 如果这是正确的,我会感到惊讶的是,更多的人没有碰到这一点,而且在SO和其他论坛上也不是更明显.我想在生成的线程上进行第一次数据库活动与主线程中的至少一些初始工作相比有点不寻常?