Сбой первых подключений Qt и MySQL

#mysql #qt

#mysql #qt

Вопрос:

Я использую Qt 5.15 и устанавливаю стандартное соединение с MySQL

 bool open() {
 QMutexLocker ml(amp;fMutex);
 fDatabaseNumber = QString::number(  fDatabaseCounter);
 fSqlDatabase = QSqlDatabase::addDatabase("QMYSQL", fDatabaseNumber);
 fSqlDatabase.setHostName(host);
 fSqlDatabase.setDatabaseName(schema);
 fSqlDatabase.setUserName(username);
 fSqlDatabase.setPassword(password);
 if (!fSqlDatabase.open()) {
     qDebug() << fSqlDatabase.lastError().databaseText();
     return false;
 }
 fQuery = new QSqlQuery(fSqlDatabase);
 return true;
}
 

Как обычно :). Я вызываю этот код из 10 разных потоков одновременно. И всегда несколько первых подключений к базе данных завершаются сбоем с сообщением «Не удается подключиться к серверу MySQL на ‘127.0.0.1’». Все последующие подключения успешны, независимо от того, сколько потоков подключений выполняется одновременно. Я не знаю, что я делаю не так.

Комментарии:

1. Вы не можете получить это сообщение, потому что вы не выводите сообщение об ошибке в своем коде. Также вы не должны совместно использовать соединение с QSqlDatabase в разных потоках.

2. Извините, теперь я получаю вывод: if (!fSqlDatabase.open()) { qDebug() << fSqlDatabase.lastError().databaseText(); return false; } я не разделяю соединение между потоками, каждый поток использует свою собственную базу данных QMutexLocker ml(amp;fMutex); fDatabaseNumber = QString::number( fDatabaseCounter); fSqlDatabase = QSqlDatabase::addDatabase("QMYSQL", fDatabaseNumber);

3. Вы написали небольшой тест, в котором вы подключаетесь только к базе данных в основном потоке и ничего больше, просто чтобы доказать, нет ли другого соединения?

4. После некоторых исследований я обнаружил, что libmysql.dll модуль не был загружен до первого sql-запроса. Когда потоки запускаются одновременно, загружается самый первый sql-запрос libmysql.dll и другие потоки пытаются сделать это независимо друг от друга. В то же время они мешают друг другу. В этом случае я получаю сообщение об ошибке. Теперь я просто добавил объявление класса базы данных в void main () {}, чтобы libmysql.dll загружается заранее, и ошибка исчезает.