遇到這種情況,小記一下。
發現服務運行得好好的,連接數據庫的時候隔一段時間就會報數據庫連接異常,看了一下日誌報一個“error during Connection reset by peer”——報錯十分直觀 ,就是數據庫主動斷開了連接。
查詢發現sqlserver設置了X分鐘的超時時間,如果超過這個時間數據庫連接線程沒有任何操作,sqlserver會主動把連接斷開以節約資源。所以,如果數據庫操作完成,應該由應用程序把數據庫連接主動斷開。
sqlalchemy是維護了一個數據庫連接池,因此,只要程序還在運行,連接池裏的默認是有保持與數據庫的長連接線程存在。
因此,我們把sqlalchemy裏的數據庫連接時間設置小於X分鐘。設置方法爲SQLALCHEMY_POOL_RECYCLE=XXX(這裏的單位是秒)
相關參數:
SQLALCHEMY_POOL_RECYCLE:自動回收數據庫連接的秒數。
SQLALCHEMY_POOL_SIZE:數據庫連接池的大小,默認爲5
SQLALCHEMY_POOL_TIMEOUT:指定數據庫連接池的超時時間,默認爲10秒。
參考資料:
http://www.pythondoc.com/flask-sqlalchemy/config.html 這個是sqlalchemy相關參數的解析,還很詳細的