最近Qt项目出现数据不入库情况,qDebug打印输出错误,报
QSqlError(2006, "QMYSQL: Unable to execute query", "MySQL server has gone away")
网上查找原因分析是由于超过8小时数据库长连接没有任何操作,Mysql服务主动断开连接导致sql语句执行不成功,解决方法大概以下几种:
1.使用短连接机制,每次执行SQL语句连接后断开;
2.更改Mysql服务默认8小时超时时间;
3. 在执行sql语句之前判断连接是否断开,进行重新判断。
方法1,2网上都有示例不描述,主要针对方法3进行优化,由于使用Qt4.8.6无法根据isOpen()判断是否连接正确,通过执行
select 1是否报错来判断连接是否成功,代码如下:
bool CDBManager::ConnectDB() { //获取数据库配置信息 STRU_MYSQL_CFG stuDBCfg; CConfig::GetAfxConfig()->GetMySqlCfg(&stuDBCfg); if(QSqlDatabase::contains("lh")) { m_CfgDB = QSqlDatabase::database("lh"); if(m_CfgDB.isOpen()) { QSqlQuery query(m_CfgDB); QString strSql =QString("select 1"); query.exec(strSql); if(query.lastError().isValid()) { m_CfgDB.close(); bRtn = m_CfgDB.open(); qDebug()<< QString("m_CfgDB重新连接"); } else { bRtn = true; } } else { m_CfgDB.close(); bRtn = m_CfgDB.open(); } } else { m_CfgDB = QSqlDatabase::addDatabase("QMYSQL", "lh"); this->CreatMysqlDB(stuDBCfg);//先创建Mysql m_CfgDB.setHostName(stuDBCfg.strIP); //设置主机地址 m_CfgDB.setPort(stuDBCfg.nPort); //设置端口 m_CfgDB.setDatabaseName(stuDBCfg.strDataBaseName); //设置数据库名称 m_CfgDB.setUserName(stuDBCfg.strUser); //设置用户名 m_CfgDB.setPassword(stuDBCfg.strPwd); //设置密码 m_strMysqlDBName = stuDBCfg.strDataBaseName; if(m_CfgDB.open()) { return true; } else { //延迟1分钟判断Mysql有没有启动 QSqlError error; error=m_CfgDB.lastError(); int count = 0; while(QSqlError::NoError !=error.type()) { if(m_CfgDB.open()) { return true; } else if(count>60) { break; } error=m_CfgDB.lastError(); QCoreApplication::processEvents(); cross_sleepms(1000); count++; } qDebug()<<"failed to connect to mysql"; return false; } } } return bRtn; }