在使用apscheduler+django-apscheduler做定时任务,但是连接超过八小时后连接失效,连接数据库失败。
代码:
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore
from apscheduler.events import EVENT_JOB_EXECUTED, EVENT_JOB_ERROR
from django.db import close_old_connections
job_defaults = {
'max_instances': 10,
'misfire_grace_time': 9
}
sch = BackgroundScheduler(job_defaults=job_defaults)
# 设置连接时长为7小时
sch.add_jobstore(DjangoJobStore, 'default', engine_options={'pool_pre_ping': True, 'pool_recycle': 25200})
sch.add_listener(my_listener, EVENT_JOB_EXECUTED | EVENT_JOB_ERROR)
sch._logger = logger
sch.start()
超时后,怎么样重新连接呢。任务中关闭了无效连接,但是这个怎么定时任务怎么设置超时重连呢?
希望指点下切实可行的方法,百度中的方法试了好多,但是都无效。
定时任务用django-crontab比较好
定时任务间隔超过8小时,超过八小时没有数据交互数据库会判断服务器中止连接。然后定时任务查询报错default(2006,软件中止了一个已建立的连接),后续数据查询会返回default,(0,")报错问题!(这个问题是在获取定时任务信息的时候出的问题,网上好多都是在说定时任务中的任务连接问题,任务都获取不到,更不用说执行任务了。)
1、windows环境,django2.2.5+apscheduler+django-apscheduler,使用的pymysql库连接mysql.
2、定时任务间隔大于8小时,数据库设置是wait_time正常的8小时.
在网上找了好多方法,包括:1、设置add_jobstore的engin_options={‘pool_pre_ping’: True, 'pool_recycle': 25200}参数(七小时检查一次连接)——无效。2、django.db.connection.connection.ping()检查数据连接方法——无效(因为这个数据连接的方法是做在外部的,定时任务启动时初始化才会调用到这个方法,启动之后在查询定时任务时这个方法将不再调用,所以无效)3、django.db.close_old_connections()——和方法二同样的道理,无效。(但是2、3这个对定时任务的任务中的数据连接有效)
3、无奈之举:做了一个一直存在的定时任务,每隔6小时执行一次,使数据库连接保持活跃。(不过这个方法很明显是一个浪费资源,并且不合适的做法)
4、(一个似乎可行的办法,通过初步测试可以)扒拉源码发现,定时任务的查询会调用DjangoJobStore的_get_jobs方法,重写DjangoJobStore类,继承重写该方法。s=apscheduler.BackgroundScheduler() s.add_jobstore(自定义类,'default')
5、希望有搞定这个的朋友不吝赐教下,有没有更好的方法来解决这个问题
我想问下用redis会避免这个错误嘛?