You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免数据库连接断开时QSqlQuery::prepare出现挂起?

解决方案

1. 启用MySQL自动重连特性

MySQL客户端库原生支持断连后自动重连,通过MYSQL_OPT_RECONNECT选项开启,Qt SQL可直接将该参数传递给底层驱动。在初始化数据库连接时添加该配置:

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("your_host");
db.setDatabaseName("your_db");
db.setUserName("user");
db.setPassword("pass");
// 开启自动重连并设置读写超时
db.setConnectOptions("MYSQL_OPT_RECONNECT=1;MYSQL_OPT_READ_TIMEOUT=5;MYSQL_OPT_WRITE_TIMEOUT=5");
if (!db.open()) {
    // 处理连接失败逻辑
}

MySQL 8.0中该选项默认关闭,显式开启后,客户端会在检测到连接断开时自动尝试重建连接,避免prepare操作挂起。

2. 修正超时参数的作用范围

你之前设置的MYSQL_OPT_CONNECT_TIMEOUT仅控制初始连接阶段的超时,而prepare属于已连接后的交互操作,需要通过MYSQL_OPT_READ_TIMEOUT和MYSQL_OPT_WRITE_TIMEOUT限制读写类操作的等待时长,从根源避免无限挂起。

3. 显式绑定数据库连接

确保QSqlQuery使用的是已配置好参数的数据库连接,若存在多连接场景,建议显式指定连接对象:

bool remove(unsigned long long test_set_id) const
{
    QSqlDatabase db = QSqlDatabase::database(); // 获取默认连接
    QSqlQuery query(db); // 显式绑定目标连接
    query.prepare(queries::delete_from_Station_by_test_id.data());
    query.addBindValue(test_set_id);
    return query.exec();
}

补充说明

  • 自动重连生效后,断开期间未提交的事务会被MySQL自动回滚,业务代码需适配该场景。
  • 确认Qt MySQL驱动基于系统MySQL 8.0客户端库编译,避免版本不兼容导致配置失效。

内容的提问来源于stack exchange,提问作者Narek Aydinyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 08:33:18