在使用 Qt 5.14 的 SQL 模块连接远程 MySQL 数据库时,长时间不活动可能导致数据库连接超时并失效。为了维持连接的有效性,可以考虑以下几种方法:
1. 使用 QSqlDatabase::setConnectOptions
可以通过设置连接选项来影响连接的行为。例如,可以设置 “MYSQL_OPT_RECONNECT” 选项,以便在失去连接后自动尝试重新连接:
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("your_host");
db.setDatabaseName("your_database");
db.setUserName("your_username");
db.setPassword("your_password");
// 设置重连选项
db.setConnectOptions("MYSQL_OPT_RECONNECT=1");
if (!db.open()) {
// 处理错误
}
2. 执行心跳查询
定期执行一个简单的查询(例如 SELECT 1
),以确保数据库连接仍然有效。这可以通过定时器来实现:
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, [&]() {
if (db.isOpen()) {
QSqlQuery query(db);
query.exec("SELECT 1"); // 心跳查询
}
});
timer->start(300000); // 每5分钟执行一次
3. 调整 MySQL 服务端的超时时间
如果您有权限修改 MySQL 配置,可以增加服务端的 wait_timeout
和 interactive_timeout
参数值,以允许更长时间的不活动而不关闭连接。
4. 错误处理和重连逻辑
在进行数据库操作时,如果检测到连接已断开(例如捕获异常或检查返回状态),应编写重连逻辑尝试重新打开数据库连接。
综上所述,建议结合以上措施,特别是定期执行心跳查询和设置自动重连选项,以确保在长时间不活动期间保持与远程 MySQL 数据库的有效连接。
内容由零声教学AI助手提供,问题来源于学员提问