月度归档:2023年05月

Qt连接远程数据库的优化方案

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;
        }