【问题标题】:Django/Docker-compose: Retry Database Connection when: django.db.utils.OperationalError: (2002, "Can't connect to MySQL server on 'db' (115)")Django / Docker-compose:重试数据库连接时:django.db.utils.OperationalError:(2002,“无法连接到'db'(115)上的MySQL服务器”)
【发布时间】:2021-01-16 01:56:30
【问题描述】:

已在此处提出此问题:django.db.utils.OperationalError: (2002, "Can't connect to MySQL server on 'db' (115)"),答案是等待数据库准备好。

但是,官方文档在这里:https://docs.docker.com/compose/startup-order/ 建议改为实现应用内重试方法,以便在失败时重试数据库连接。

要处理此问题,请将您的应用程序设计为在发生故障后尝试重新建立与数据库的连接。如果应用程序重试连接,它最终可以连接到数据库。

最好的解决方案是在您的应用程序代码中执行此检查,无论是在启动时还是由于任何原因失去连接时。

不幸的是,文档仅止于此,并没有提供有关如何实现此重试方法的任何示例或指南。有谁知道如何以干净的方式做到这一点?

【问题讨论】:

    标签: python mysql django docker-compose retry-logic


    【解决方案1】:

    在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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-15
      • 2017-11-18
      • 2015-07-08
      • 2018-10-29
      • 2016-11-23
      • 2022-08-11
      • 2019-08-02
      相关资源
      最近更新 更多