Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Qt 5.1 MYSQL Multithreading


Автор: becks 22.10.2013, 14:52
Добрый день. Есть MYSQL база данных, в нее идет запись из нескольких потоков. Вот основная функция записи каждого потока:
Код

int IndexThread::insertDataIntoDB(const QStringList &files)
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", m_uid);

    db.setHostName("127.0.0.1");
    db.setDatabaseName("ssa");
    db.setPort(3306);
    db.setUserName("root");
    db.setPassword("admin");

    bool ok = db.open();
    if (!ok)
    {
        qDebug() << "open error " << db.lastError().text() << endl;
        return -1;
    }

    foreach (QString fileName, files)
    {
        QSqlQuery query(db);
        if ( !createQuery(fileName, query) )
            continue;

        ok = query.exec();
        if (!ok)
        {
            QSqlError error = query.lastError();
            qDebug() << "query error " << error.text() << "  " << error.number() << endl;

            if ( error.type() == QSqlError::ConnectionError  || error.type() == QSqlError::StatementError ||
                 error.type() == QSqlError::TransactionError || error.type() == QSqlError::UnknownError )
            {
                return -3;
            }
        }
    }

    db.close();

    return 0;
}


Запись обычный INSERT INTO.

Запускаю несколько потоков с укладкой (укладка производится довольно быстро, данных немного), получаю:

open error «Unknown MySQL server host '127.0.0.1' (0) QMYSQL: Unable to connect
open error „Unknown MySQL server host '127.0.0.1' (0) QMYSQL: Unable to connect

Количество таких сообщений обычно на 1 или 2 меньше количества потоков.
Если запускать один поток, все работает нормально. Для других задач (не SQL) работает хоть с 10-20 потоками нормально.

Win 7 64. Qt 5.1.1 MSVC2012 64. MYSQL 5.6.14.0. Таблицы — InnoDB

Автор: bsa 22.10.2013, 21:17
becks, может у бд есть ограничение на количество одновременных подключений?

Автор: becks 23.10.2013, 17:54
Цитата(bsa @  22.10.2013,  21:17 Найти цитируемый пост)
becks, может у бд есть ограничение на количество одновременных подключений? 

Проверил, везде стоит значение 0 - т.е. нет никаких ограничений по коннектам из документации.
Создал, на всякий случай другого пользователя, до этого пробовал все на администраторе. Результат тот же.

Цитата

«Unknown MySQL server host '127.0.0.1' (0) QMYSQL: Unable to connect


Если поможет номер ошибки 2005.

Чего уже только не испробовал, ничего не выходит.

Автор: vinter 23.10.2013, 18:50
mysql консольный тул соединяется с базой нормально? При тех же параметрах
Почему грешишь на потоки? Не вижу в описании ничего потокозависимого. Попробуй создай пустой проект и присоединись к базе из него. 

Автор: becks 23.10.2013, 23:54
Цитата

mysql консольный тул соединяется с базой нормально? При тех же параметрах

Абсолютно нормально. 

Цитата

Почему грешишь на потоки?

Если писать одним потоком - все работает отлично. Как только поялвляется хотя бы второй, появляются ошибки.

Цитата

Попробуй создай пустой проект и присоединись к базе из него.

С этого все и начал. Работало. Потом перенес все это на потоки. И тут возникли проблемы.

Автор: vinter 24.10.2013, 06:41
Цитата

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", m_uid);

Я так понимаю, что эта функция(insert) у тебя вызывается не один раз, а значит эта строчка не должна быть здесь. Здесь должна быть database(m_uid);, а инициализация базы для потока должна быть в едином месте. Так же проверь являются ли m_uid уникальными для каждого потока и удостоверься, что QSqlDatabase::addDatabase("QMYSQL", m_uid); происходит в отдельном потоке.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)