1. 程式人生 > 其它 >使用flask sqlalchemy過程中遇到的問題

使用flask sqlalchemy過程中遇到的問題

 

程式背景:

2個定時任務分別去執行兩個資料庫的操作,使用的定時任務工具是:
from apscheduler.schedulers.background import BackgroundScheduler(非阻塞)
from apscheduler.schedulers.blocking import BlockingScheduler(阻塞)
  2個定時任務,其中一個數據量較少的任務a,每次的請求都能成功,另外一個數據量較大的任務b,定時任務的週期較長,每每b任務都執行不成功。  

報錯如下:

pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query')

我嘗試過的辦法:

  經過查詢https://blog.csdn.net/qq_37287621/article/details/104805160,該報錯說明程式和mysql的連結斷開了,於是我照著網上的流程,去查詢資料庫的連結時長
SHOW SESSION VARIABLES LIKE '%timeout%';
查詢顯示:wait_timeout變數的值是300,也就是5分鐘。網上的解決方式:
修改資料庫連線池的配置,資料庫連線池都會帶有一個引數:回收時間(就是一定時間內不使用就會回收),修改這個引數的值,不要大於wait_timeout的值即可。在flask-SQLAlchemy中有個配置是SQLALCHEMY_POOL_RECYCLE(多之後對執行緒池中的執行緒進行一次連線的回收),如果這個值是-1代表永不回收,Flask-SQLALchemy 自動設定這個值為2小時,我們可以將這個值設定的小於wait_timeout引數的值也就是5分鐘即可。
我在flask程式中配置了 app.config['SQLALCHEMY_POOL_RECYCLE'] = 200 (小於資料庫連線) 然而並沒有什麼作用,為啥2個定時任務中,a任務也需要跟資料庫互動,但不存在互動斷開的問題。 幾經查詢,看到網上一位網友吐槽了,大資料量情況下的頻繁插入、頻繁commit,造成資料庫的連結斷開,或者丟資料的場景,這位網友用了計數器,如:每100次add,一次commit。https://blog.csdn.net/ywdhzxf/article/details/85012255    

於是,我通過以下方法成功的解決了這一問題:

1、調整定時任務的間隔時間 2、優化批量插入:
class
TableA(db.Model):   __tablename__ = "table_a"   id = db.Column(db.INTEGER,primary_key=True, autoincrement=True)   name = db.Column(db.String(255))   age = db.Column(db.Text)   create_time = db.Column(db.DateTime,default=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))   def create_obj(self,datalist): # datalist=[{"name":"張三","age":"1"}]     from start import app     with app.app_context():       db.session.execute(TableA.__table__.insert(),datalist)       db.session.commit()