回复: Qt数据库集成应用封装
#11 回 apud 的帖子 [liudianwu 07-14 08:29]
apud:
楼主,一两年前我陆陆续续花了一两百块买过你几个源码,实在经典,学到不少东西。现有一个问题特来请教:使用qt连接阿里云的数据库,软件闲置几分钟再次操作数据库,显示mysql has gone away。这应该怎么解决,按照网上办法修改my.ini配置依然无效。软件要求效率高,所以不可能需要用到数据库操作时再次重连。也就是我希望它能长时间保持和数据库连接。
这个问题是mysql数据库的经典问题,貌似开源版本的就是存在这个问题,目前我们的水平很难从源码层更改mysql,只能定时判断数据库连接,然后一旦发现执行失败超过次数则说明数据库断开了连接,这样就重新连接数据库即可!
核心代码如下#include "dblocalthread.h"
DbLocalThread *DbLocalThread::self = 0;
DbLocalThread::DbLocalThread(QObject *parent) : QThread(parent)
{
stopped = false;
dbOkLocal = false;
lastCheckTimeLocal = QDateTime::currentDateTime();
checkInterval = 30;
dbTypeLocal = DbType_MySql;
connNameLocal = "qt_sql_default_connection";
hostNameLocal = "127.0.0.1";
portLocal = 3306;
dbNameLocal = "tcms_liu_mysql";
userNameLocal = "root";
userPwdLocal = "root";
}
void DbLocalThread::run()
{
while (!stopped) {
//定时执行一次校验数据库连接是否正常
QDateTime now = QDateTime::currentDateTime();
if (lastCheckTimeLocal.secsTo(now) >= checkInterval) {
checkDb();
..
#12 [apud 07-14 20:32]
非常感谢,我学习下。我记得之前使用阿里云的另一个套餐的数据库并没有这个问题。换了ECS服务器,自己windows server 2008装了个数据库就存在这个问题。如果用这个方法重连的话,是否对效率有影响。
#13 回 apud 的帖子 [liudianwu 07-14 21:04]
apud:非常感谢,我学习下。我记得之前使用阿里云的另一个套餐的数据库并没有这个问题。换了ECS服务器,自己windows server 2008装了个数据库就存在这个问题。如果用这个方法重连的话,是否对效率有影响。 (2017-07-14 20:32)
完全没有影响,因为是多线程,丝毫不会内存泄漏!Qt对数据库的封装还是非常完美的,采用了连接名称作为处理标识符。
#14 [apud 07-15 07:09]
OK。顺便问一下。你这源码可以购买吗?
我挺感兴趣的,想支持一下大神。
建议你可以开一个淘宝店,这样购买源码也方便点。
#15 回 liudianwu 的帖子 [apud 07-25 09:46]
liudianwu:这个问题是mysql数据库的经典问题,貌似开源版本的就是存在这个问题,目前我们的水平很难从源码层更改mysql,只能定时判断数据库连接,然后一旦发现执行失败超过次数则说明数据库断开了连接,这样就重新连接数据库即可!
核心代码如下#include "dblocalthread.h"
DbL .. (2017-07-14 08:29)
用这种方法遇到的一个问题,程序运行几分钟后,刚好过了30秒,程序判断数据库连接正常,没有进行重连操作。然后过了几秒 ,我进行了数据库操作,就gone away了。也就是保险的方法还是要需要操作数据库的时候强制重连。