sqlalchemy中出現"MySQL server has gone away"的解決方法


最近項目中用到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的值只要小於環境中連接關閉的最小間隔就可以了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM