qt多线程适用mysql_qt 多线程访问数据库问题

Qt数据库由QSqlDatabase::addDatabase()生成的QSqlDatabase只能在创建它的线程中使用, 在多线程中共用连接或者在另外一个线程中创建query都是不支持的

假设有如下代码:

bool openDatabase()

{

QSqlDatabase db;

QString connectionName = "sqlite";

db = QSqlDatabase::addDatabase("QSQLITE", connectionName);

db.setDatabaseName("/jyxtec.db");

if (db.open()) return true;

else return false;

}

void testQuery()

{

QSqlQuery query(QSqlDatabase::database("sqlite"));

query.exec("SELECT * from t_test");

}

这里的testQuery()是不支持多线程调用的,只能在调用OpenDatabase()的线程中使用.否则很容易段错误。

解决方法有两种:

1)每个调用testQuery的线程中创建不同connectionName的QSqlDatabase

比如线程A

QSqlDatabase::addDatabase("QSQLITE", "A");

QSqlQuery query(QSqlDatabase::database("A"));

线程B

QSqlDatabase::addDatabase("QSQLITE", "B");

QSqlQuery query(QSqlDatabase::database("B"));

2)实现一个数据库线程池,创建N个不同connectionName的QSqlDatabase,所有的query命令都放到这个线程池中处理。

在此感谢网络大牛

参考地址:

http://blog.csdn.net/goldenhawking/article/details/10811409

http://blog.chinaunix.net/uid-20680966-id-4779621.html

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 Qt 的 QSqlDatabase 和 QSqlQuery 类来执行 MySQL 数据库插入操作。在多线程环境下,需要注意数据库连接的线程安全性,可以使用 QMutex 或 QReadWriteLock 来保证线程安全。以下是一个示例代码: ```cpp #include <QtSql> #include <QThread> class DatabaseWorker : public QObject { Q_OBJECT public: DatabaseWorker(QObject *parent = nullptr) : QObject(parent) {} public slots: void insertData(const QString &name, int age) { QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("localhost"); db.setDatabaseName("mydatabase"); db.setUserName("myusername"); db.setPassword("mypassword"); if (!db.open()) { qWarning() << "Failed to connect to database:" << db.lastError().text(); return; } QSqlQuery query(db); query.prepare("INSERT INTO mytable (name, age) VALUES (:name, :age)"); query.bindValue(":name", name); query.bindValue(":age", age); if (!query.exec()) { qWarning() << "Failed to insert data:" << query.lastError().text(); return; } qDebug() << "Data inserted successfully:" << name << age; } }; int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); DatabaseWorker worker; QThread thread; worker.moveToThread(&thread); thread.start(); QObject::connect(&app, &QCoreApplication::aboutToQuit, &thread, &QThread::quit); QObject::connect(&worker, &DatabaseWorker::insertData, &worker, &DatabaseWorker::insertData, Qt::QueuedConnection); worker.insertData("Alice", 20); worker.insertData("Bob", 30); worker.insertData("Charlie", 40); return app.exec(); } ``` 这个示例代码演示了如何在多线程环境下执行 MySQL 数据库插入操作。在主线程中创建一个 DatabaseWorker 对象,并将其移动到一个新的线程中。然后,通过信号槽机制将插入数据的请求发送到 DatabaseWorker 对象中执行。在 DatabaseWorker 对象中,首先创建一个 QSqlDatabase 对象,并设置连接参数。然后,创建一个 QSqlQuery 对象,并使用 prepare() 方法准备 SQL 语句。接着,使用 bindValue() 方法绑定参数,并执行 SQL 语句。最后,通过 qDebug() 输出插入数据的结果。注意,这里使用了 Qt::QueuedConnection 来确保插入数据的请求在新线程中执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值