#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 загружается заранее, и ошибка исчезает.