在框架中使用Mysql 数据库存在一个问题,即连接八小时之内没有执行命令则自动断开,最简单的解决方法是重启服务。
暴力解决
重启服务这显然是不友好的,还有一种方法是设置等待时间,如设置:
interactive_timeout = 360000
wait_timeout = 360000
如上设置能保证服务十天不断开,但如果用户超过十天没使用该服务则又需要重启,该方法治标不治本。
sql查询解决
另外一种方法是在每次sql查询之前都判断连接是否正常,如果不正常则重新连接。步骤如下:
connection = Connect(
host="xxxx",
port=3306,
user="root",
password="root",
db="test",
charset="utf8"
)
....
def select():
connection.ping(reconnect=True)
cur.execute(sql)
db.commit()
定时任务解决
上面的方法显然是可以解决问题的,但如果查询过多,每次都检查状态总感觉有点不合适,而服务默认八小时不运作则关闭,我们是否可以每隔八小时获取一次连接,如果可以获取到则保持,不能获取到则重新获取,如下演示:
此处使用fastAPI框架进行演示,首先设置定时任务,此处的connection即为数据库的连接:
# 定时任务
from apscheduler.schedulers.asyncio import AsyncIOScheduler
def job(connection):
t = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
print("{} 触发了定时任务!".format(t))
connection.ping(reconnect=True)
def scheduler_task():
scheduler = AsyncIOScheduler()
scheduler.add_job(job, 'interval', hours=8, args=[connection])
scheduler.start()
之后在路由处配置即可:
# 定时任务
@app01.on_event('startup')
async def init_scheduler():
scheduler_task()
更详细的可参考:
fastApI 定时任务apscheduler
Python 定时调度
pymysql定时检查数据库连接状态