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-8
import pymysql
import time
from DBUtils.PooledDB import PooledDB
pool = 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()