sqlalchemy 8小時連接失敗(flask項目)

文章目錄


問題描述:
使用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))

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章