文章目錄
問題描述:
使用gunicorn啓動flask項目,一晚上沒有訪問Web,第二天訪問,報錯連接數據庫失敗。
Flask-- 1.1.2
MySQL-- 5.7.30
SQLAlchemy – 1.3.16
原因:mysql自身8小時未連接,則會自動斷開(默認)
解決方案:
mysql> show variables like '%timeout%';
+-----------------------------+----------+
| Variable_name | Value |
+-----------------------------+----------+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| have_statement_timeout | YES |
| innodb_flush_log_at_timeout | 1 |
| innodb_lock_wait_timeout | 50 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 28800 |
| lock_wait_timeout | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| rpl_stop_slave_timeout | 31536000 |
| slave_net_timeout | 60 |
| wait_timeout | 28800 |
+-----------------------------+----------+
-
方案一:
其中 interactive_timeout wait_timeout 28800 = 60 * 60 * 8 即8小時
方案一: 加這兩個延時,加長時間,網上查詢最大爲24天,未實踐 -
方案二:
方案二:_engine = create_engine(db_url=“db_url”, pool_recycle=3600)
設置pool_recycle參數,修改sqlalchemy連接池時間,小於8小時,即當連接池小於這個時間,則會斷開,重新創建,不會與mysql8小時衝突。 -
方案三:
方案二:_engine = create_engine(db_url=“db_url”, poolclass=NullPool)
關閉連接池,測試失敗 -
方案四:
flask 項目
@app.teardown_appcontext
def shutdown_session(exception=None):
session.remove()
SQLAlchemy session
參考鏈接
線程安全
session不是線程安全的,並且我們一般session對象都是全局的,那麼在多線程情況下,當多個線程共享一個session時,數據處理就會發生錯誤。
爲了保證線程安全,需使用scoped_session方法:
db_session = scoped_session(sessionmaker(bind=engine))