最近項目中用到sqlalchemy來作為orm框架,數據庫引擎用的是pymysql,demo做出來之后,調用一個數據錄入功能的API偶爾發現會出現500錯誤,查看后台日志在API執行過程中報了“MySQL server has gone away”錯誤,起初認為是數據有問題,但是后來經過調試,同一份數據有的時候可以執行有的時候就報錯。所以懷疑還是sqlalchemy中的問題,相關代碼如下,
_engine = create_engine("mysql+pymysql://{}:{}@{}:{}/{}?charset={}".format(self.username, self.password, self.host, self.port,self.dbname, self.charset)) dbsession = sessionmaker(bind=_engine)
_session = dbsession()
這是官網上給出的最簡單的連接創建方式,繼續讀文檔發現sqlalchemy默認會維持一個5個連接的數據庫連接池,而池里面的連接默認是永不失效!也就意味着如果數據庫方面或者網關把連接斷掉了,池里面的連接就會變成一個無效連接,繼而出現開頭遇到的這個問題。於是修改連接參數,加入“pool_recycle=60”表示池中的連接只維持1分鍾時間,超出1分鍾的連接會被棄用用新連接來代替,修改過后服務一切正常。
_engine = create_engine("mysql+pymysql://{}:{}@{}:{}/{}?charset={}".format(self.username, self.password, self.host, self.port,self.dbname, self.charset),
pool_recycle=60) dbsession = sessionmaker(bind=_engine) _session = dbsession()
文中的60秒超時時間並不是一個絕對合理的值,需要根據業務環境來配置,mysql默認的連接超時時間是8小時,但是我們實際環境中測出來的超時時間遠遠小於8小時,所以有可能是網關之類的設施將連接關閉的,但是並沒有具體確認。所以理論上來說,pool_recycle的值只要小於環境中連接關閉的最小間隔就可以了。
