Qt内部提供的MySQL连接方案是内部插件QMYSQL的,如果在连接配置不当时长时间空闲时,会导致线程琐死,主要原因mysql_stmt_prepare这个函数阻塞了线程,导致一直不返回.
默认的情况下,以下参数都是0,我们需要设置一个时间,让其超时返回.
MYSQL_OPT_RECONNECT=1;
MYSQL_OPT_CONNECT_TIMEOUT=10;
MYSQL_OPT_READ_TIMEOUT=10;
MYSQL_OPT_WRITE_TIMEOUT=10
此外,我们还需要增加一个定时轮循的健康检查函数,避免长时间空闲而自动断开,从而导致访问超时重连的异常处理.
健康检查的SQL语句是: select 1 as result;这个SQL不涉及表操作,性能很高,能正确返回1即可.
db = QSqlDatabase::addDatabase(driver, connectionName);
QString hostName = QKgSettings::value("Mysql/hostName", "127.0.0.1").toString();
int port = QKgSettings::value("Mysql/port", 3306).toInt();
QString userName = QKgSettings::value("Mysql/userName", "test").toString();
QString password = QKgSettings::value("Mysql/password", "123").toString();
QString database = QKgSettings::value("Mysql/database", "woall").toString();
db.setConnectOptions("MYSQL_OPT_RECONNECT=1;MYSQL_OPT_CONNECT_TIMEOUT=10;MYSQL_OPT_READ_TIMEOUT=10;MYSQL_OPT_WRITE_TIMEOUT=10");
db.setHostName(hostName);
db.setPort(port);
db.setUserName(userName);
db.setPassword(password);
db.setDatabaseName(database);
if(!db.open()) {
return db;
}