我正在使用QMYSQL连接到本地数据库。该应用程序运行在多个线程上。每个线程使用独立连接连接到数据库。当我尝试连接数据库时,有时Qt会抛出以下错误。有什么问题?
QMYSQL: Unable to allocate a MYSQL object
更新
添加了用于连接的代码。此对象被移动到一个线程,该连接被命名。 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" );
}
更新2
我刚刚意识到,每次从主线程建立连接时(主踏板中没有活动连接),驱动程序都无法加载。我刚刚在main()
中添加了一个小的虚拟连接代码,它可以立即连接和断开连接(在任何线程连接之前)。添加该代码,一切正常。我不确定为什么线程在主线程中的连接之前无法连接,但我认为它看起来像一个bug。希望这有助于某人,花了我3天时间:/
答案 0 :(得分:9)
您上次更新后可能不在乎,但我有一个基于它的理论:this表示必须从mysql_library_init()
为多线程应用程序调用{{1}}。
如果查看Qt plugin source,该方法将包含在main()
中,该qLibraryInit()
是从QMYSQLDriver : QSqlDriver
构造函数调用的,而我认为这些构造函数是由{{1}间接创建的在你的使用环境中。
MySQL docs注意addDatabase()
可以通过互斥锁来保护,这需要QtSql代码保护所有QSqlDriver构造,我认为它没有。所以我不确定这是否会被视为Qt代码错误或文档中的差距。
这一切都符合你所描述的行为,但我仍然怀疑自己 - 如果这是正确的,我会感到惊讶的是,更多的人没有碰到这一点,而且在SO和其他论坛上也不是更明显。我想在生成的线程上进行第一次数据库活动与主线程中的至少一些初始工作相比有点不寻常吗?
答案 1 :(得分:-1)
Qt中存在与QSqlDatabase :: isOpen()相关的错误。 http://bugreports.qt-project.org/browse/QTBUG-223
如果您通过QSqlQuery :: exec()的查询失败,QSqlQuery :: lastError()会给您一个错误。另外QSqlDatabase :: isOpen()应报告连接状态,QSqlDatabase :: lastError()也可用