實際的原因在於mysql 設置的timeout大於你的腳本執行時間,導致django的查詢超時。
登錄mysql可以查看mysql wait_timeout:
SHOW GLOBAL VARIABLES;
django為了減少不必要的數據庫連接、關閉,復用了數據庫連接,當開始一個請求后建立一個連接池存放連接,之后此次請求都復用一個連接。那猜測就是django保存連接的比wait_timeout長了,如果保存時間短一些就可以重新建立連接避免此錯誤了。
沒錯,官方文檔也已經說明了此問題,設置數據庫 CONN_MAX_AGE參數,示例:
DATABASES = { "default": { 'ENGINE': 'django.db.backends.mysql', 'NAME': '', 'USER': '', 'PASSWORD': '', 'HOST': '', 'CONN_MAX_AGE': 9 # 比wait_timeout小一些 } }
但是有的時候需要執行非常耗時的job,這種方式是行不通的。
解決方案:
再查詢之前加入:
django.db.close_old_connections