尝试创建数据库引擎并处理连接错误
(retries=5, delay=2)
| 63 | |
| 64 | # 创建带有重试机制的数据库引擎 |
| 65 | def get_engine(retries=5, delay=2): |
| 66 | """尝试创建数据库引擎并处理连接错误""" |
| 67 | for attempt in range(retries): |
| 68 | try: |
| 69 | logger.info(f"尝试连接到数据库: {DB_HOST}:{DB_PORT}, 尝试 {attempt+1}/{retries}") |
| 70 | # 添加connect_args以提高连接可靠性 |
| 71 | engine = create_engine( |
| 72 | DATABASE_URL, |
| 73 | pool_pre_ping=True, # 检查连接是否活跃 |
| 74 | pool_recycle=3600, # 一小时后回收连接 |
| 75 | pool_size=20, # 增加连接池大小,默认为5 |
| 76 | max_overflow=30, # 增加溢出连接数,默认为10 |
| 77 | pool_timeout=60, # 增加等待可用连接的超时时间(秒) |
| 78 | connect_args={ |
| 79 | "connect_timeout": 30 # 连接超时时间(秒) |
| 80 | } |
| 81 | ) |
| 82 | # 测试连接 |
| 83 | connection = engine.connect() |
| 84 | connection.close() |
| 85 | logger.info("数据库连接成功") |
| 86 | return engine |
| 87 | except Exception as e: |
| 88 | logger.error(f"数据库连接失败: {str(e)}") |
| 89 | if attempt < retries - 1: |
| 90 | logger.info(f"将在 {delay} 秒后重试...") |
| 91 | time.sleep(delay) |
| 92 | else: |
| 93 | logger.error("所有数据库连接尝试均失败") |
| 94 | raise Exception("无法连接到数据库,已达到最大重试次数") |
| 95 | |
| 96 | # 初始化数据库 |
| 97 | try: |