簡體   English   中英

Django/Docker-compose: Retry Database Connection when: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM