Me preocupa cómo funciona el módulo Sql con la aplicación multiproceso en Qt. http://doc.qt.io/qt-5/threads-modules.html#threads-and-the-sql-module indica claramente que "Una conexión solo se puede utilizar desde el hilo que la creó".Módulo QSql y aplicación multiproceso
Sin embargo, este trozo de código que he escrito obras:
#include <QCoreApplication>
#include <QSqlQuery>
#include <QtConcurrentRun>
void req()
{
QSqlQuery q("INSERT INTO users (username) VALUES (\"test\")");
}
void db()
{
QSqlDatabase _db;
_db = QSqlDatabase::addDatabase("QMYSQL");
_db.setDatabaseName("dbname");
_db.setHostName("host");
_db.setUserName("username");
_db.setPassword("password");
if (_db.open())
std::cout << "Ok" << std::endl;
else
std::cout << "Error" << std::endl;
}
int main(int ac, char **av)
{
QCoreApplication app(ac, av);
QtConcurrent::run(db);
sleep(1);
QtConcurrent::run(req);
return app.exec();
}
Mi diseño de la aplicación requiere de múltiples hilos para interactuar con una base de datos. Thoses threads son generados y administrados por QtConcurrent :: run().
Entonces, dado que este código funciona, ¿debería hacerlo o me encontraré con problemas al hacerlo?
¡Toda ayuda, documentación o explicación es bienvenida! Gracias.
¿Qué quiere decir con "El inconveniente es que en realidad no hace nada". ? Mi consulta se ejecuta y la entrada se inserta. Si entiendo decentemente, QSqlQuery creará su propia QSqlDatabase usando la configuración de la base de datos desde el archivo db creado por 'QSqlDatabase :: addDatabase()'? ¿Eso implica una gran cantidad de gastos generales (debido a copias de objetos o algo así)? – Xaqq
Su objeto 'QSqlQuery' no sabe nada acerca de' QSqlDatabase' que también creó porque no está usando el constructor '' db' conectado 'QSqlQuery :: QSqlQuery (QString &, QSqlDatabase)' (es decir, no pasa el pre -created 'db' a la consulta). La forma en que crea la instancia de la consulta significa que se creará/destruirá una nueva conexión de base de datos separada cada vez que se llame a 'req()'. Que es seguro para subprocesos, pero potencialmente costoso. –
Hice algunas pruebas más, y llamar a QtConcurent :: run (req) múltiple hace que el programa de prueba falte por segmentación. editar: parece que la instanciación de la consulta no es segura para subprocesos. – Xaqq