问题解决:QMYSQL: Unable to allocate a MYSQL object

场景:Qt / C++ / 多线程 / mysql
环境:Ubuntu16.04 / Qt 5.12.0 / GCC 5.3.1 64bit / MySQL 5.7.25
问题:子线程创建QSqlDatabase连接时,偶尔出现如下错误

QMYSQL: Unable to allocate a MYSQL object


查阅资料后发现,这应该是Qt的一个bug,参考:
stackoverflow: Qt MySQL adapter refuses to connect randomly, QTBUG-31468, QTBUG-54872.
大致意思是 QSqlDatabase::addDatabase 函数调用 mysql api: mysql_library_init(),虽然前者在Qt文档中描述为“thread-safe”,但后者事实上不是“thread-safe”。这就导致如果程序中第一次调用 QSqlDatabase::addDatabase 不是在主线程就有可能失败。


解决方法
参考资料中提到,如果在主线程预先创建一次数据库连接,则可以规避该问题。
可以在程序 main 函数中加入以下代码:

const QString dummyConnection = "dummy_connection";
{
    QSqlDatabase db;
    if (QSqlDatabase::contains(dummyConnection))
        db = QSqlDatabase::database(dummyConnection);
    else
        db = QSqlDatabase::addDatabase("QMYSQL", dummyConnection);
}
QSqlDatabase::removeDatabase(dummyConnection);

实测该方法有效。

你可能感兴趣的:(问题解决:QMYSQL: Unable to allocate a MYSQL object)