![](/img/trans.png)
[英]django.db.utils.OperationalError: (2002, “Can't connect to MySQL server on 'db' (115)”)
[英]Django/Docker-compose: Retry Database Connection when: django.db.utils.OperationalError: (2002, "Can't connect to MySQL server on 'db' (115)")
這里已經問過這個問題: django.db.utils.OperationalError: (2002, "Can't connect to MySQL server on 'db' (115)")答案是等待數據庫准備好。
但是,此處的官方文檔: https : //docs.docker.com/compose/startup-order/建議實現應用程序內重試方法,以便在失敗時重試數據庫連接。
要處理此問題,請將您的應用程序設計為在失敗后嘗試重新建立與數據庫的連接。 如果應用程序重試連接,它最終可以連接到數據庫。
最好的解決方案是在您的應用程序代碼中執行此檢查,無論是在啟動時還是在由於任何原因丟失連接時。
不幸的是,文檔就到此為止,並未提供有關如何實現此重試方法的任何示例或指南。 有誰知道如何以干凈的方式做到這一點?
在 manage.py 中重新啟動 django cassandra 連接
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import logging
import os
import sys
from time import sleep
from cassandra.cluster import NoHostAvailable
from django.core.management import execute_from_command_line
MAX_RETRIES_NUM = 10
def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings')
try:
from django.core.management.commands.runserver import Command
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
from django.db import connections
conn = connections['default']
no_host_available = True
retry_count = 0
sleep_time = 1
while no_host_available:
try:
conn.connect()
except NoHostAvailable:
if retry_count == MAX_RETRIES_NUM:
sys.exit()
logging.warning(f'Error de conexión con la base de datos. Reintentando conexión en {sleep_time}s')
sleep(sleep_time)
else:
no_host_available = False
sleep_time *= 1.5
retry_count += 1
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.