1 查询到期时间
show variables like ‘%timeout%’;
无查询数据库一定时间后, mysql服务端会判断为超时, 自动断开mysql连接
默认这个时间是28800秒(8小时), 但实际测试15分钟左右未查询就会导致
原因可能是腾讯云服务器是这么设定的
2 解决方案
(1) ping()重连
pymysql的connection对象有一个ping()方法,可以检查连接是否有效,在每次执行查询操作之前先执行一下ping()方法, 该方法默认的有个reconnect参数,默认是True,如果失去连接了会重连。
启动一个时钟, 每隔5或10分钟左右ping一次, 就可以避免断开了
(2) DBUtils连接池
连接池中保持着指定数量的可用连接,每次重新获取一个有效的连接进行查询操作,pymysql本身不具有连接池功能, 需要借助DBUtils
#coding:utf-8import pymysqlimport timefrom DBUtils.PooledDB import PooledDBpool = PooledDB(creator=pymysql,# 初始化时,连接池至少创建的空闲连接,0表示不创建maxconnections=3,# 连接池中空闲的最多连接数,0和None表示没有限制mincached=2,# 连接池中最多共享的连接数量,0和None表示全部共享(其实没什么卵用)maxcached=5,maxshared=3,host='localhost',port=3306,user='root',password='123456',db='mytest',charset='utf8')connection = pool.connection()cursor = connection.cursor()cursor.execute("select * from person")data = cursor.fetchall()for i in data:print(i)time.sleep(40)cursor.execute("select * from person")data2 = cursor.fetchall()for i in data2:print(i)cursor.close()connection.close()
