1 查询到期时间

show variables like ‘%timeout%’;
image.png
无查询数据库一定时间后, mysql服务端会判断为超时, 自动断开mysql连接
默认这个时间是28800秒(8小时), 但实际测试15分钟左右未查询就会导致
image.png
原因可能是腾讯云服务器是这么设定的

2 解决方案

(1) ping()重连

pymysql的connection对象有一个ping()方法,可以检查连接是否有效,在每次执行查询操作之前先执行一下ping()方法, 该方法默认的有个reconnect参数,默认是True,如果失去连接了会重连。
启动一个时钟, 每隔5或10分钟左右ping一次, 就可以避免断开了

(2) DBUtils连接池

连接池中保持着指定数量的可用连接,每次重新获取一个有效的连接进行查询操作,pymysql本身不具有连接池功能, 需要借助DBUtils

  1. #coding:utf-8
  2. import pymysql
  3. import time
  4. from DBUtils.PooledDB import PooledDB
  5. pool = PooledDB(
  6. creator=pymysql,
  7. # 初始化时,连接池至少创建的空闲连接,0表示不创建
  8. maxconnections=3,
  9. # 连接池中空闲的最多连接数,0和None表示没有限制
  10. mincached=2,
  11. # 连接池中最多共享的连接数量,0和None表示全部共享(其实没什么卵用)
  12. maxcached=5,
  13. maxshared=3,
  14. host='localhost',
  15. port=3306,
  16. user='root',
  17. password='123456',
  18. db='mytest',
  19. charset='utf8'
  20. )
  21. connection = pool.connection()
  22. cursor = connection.cursor()
  23. cursor.execute("select * from person")
  24. data = cursor.fetchall()
  25. for i in data:
  26. print(i)
  27. time.sleep(40)
  28. cursor.execute("select * from person")
  29. data2 = cursor.fetchall()
  30. for i in data2:
  31. print(i)
  32. cursor.close()
  33. connection.close()