From 0b2185777e66726545b8acc6bf1222c918a49203 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BB=B7=E5=B0=8F=E5=89=8D?= Date: Tue, 20 Jan 2026 18:53:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0ios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 86 ++++++++++++++++++++++++++++------------------------------ 1 file changed, 42 insertions(+), 44 deletions(-) diff --git a/app.py b/app.py index 8b3230d2..e3593e31 100755 --- a/app.py +++ b/app.py @@ -8566,13 +8566,11 @@ def get_stock_quotes(): return jsonify({'success': False, 'error': str(e)}), 500 -# ==================== ClickHouse 连接池(带健康检查) ==================== -_clickhouse_client = None -_clickhouse_client_lock = threading.Lock() +# ==================== ClickHouse 连接管理(每次请求新建连接,更稳定) ==================== def _create_clickhouse_client(): - """创建新的 ClickHouse 客户端连接,并验证连接有效""" - client = Cclient( + """创建新的 ClickHouse 客户端连接""" + return Cclient( host='127.0.0.1', port=9000, user='default', @@ -8583,52 +8581,52 @@ def _create_clickhouse_client(): 'send_receive_timeout': 300, } ) - # 立即验证连接,确保 socket 已建立 - try: - client.execute("SELECT 1") - except Exception as e: - print(f"[ClickHouse] 创建连接后验证失败: {e}") - raise - return client def get_clickhouse_client(): - """获取 ClickHouse 客户端(带健康检查和自动重连)""" - global _clickhouse_client + """ + 获取 ClickHouse 客户端(每次创建新连接) - with _clickhouse_client_lock: - # 如果客户端不存在,创建新连接 - if _clickhouse_client is None: - try: - _clickhouse_client = _create_clickhouse_client() - print("[ClickHouse] 创建新连接成功") - return _clickhouse_client - except Exception as e: - print(f"[ClickHouse] 创建连接失败: {e}") - _clickhouse_client = None - raise + 注意:调用方应在使用完毕后调用 client.disconnect() 释放连接, + 或使用 execute_clickhouse_query() 辅助函数自动管理连接 + """ + return _create_clickhouse_client() - # 健康检查:尝试执行简单查询 +def execute_clickhouse_query(query, params=None, max_retries=2): + """ + 执行 ClickHouse 查询(带自动重试和连接管理) + + Args: + query: SQL 查询语句 + params: 查询参数字典 + max_retries: 最大重试次数 + + Returns: + 查询结果列表 + """ + last_error = None + + for attempt in range(max_retries + 1): + client = None try: - _clickhouse_client.execute("SELECT 1") - return _clickhouse_client + client = _create_clickhouse_client() + result = client.execute(query, params) if params else client.execute(query) + return result except Exception as e: - print(f"[ClickHouse] 连接失效,正在重连: {e}") - # 安全断开旧连接 - try: - _clickhouse_client.disconnect() - except Exception: - pass - _clickhouse_client = None + last_error = e + if attempt < max_retries: + print(f"[ClickHouse] 查询失败 (尝试 {attempt + 1}/{max_retries + 1}): {e}") + import time + time.sleep(0.5) # 短暂等待后重试 + else: + print(f"[ClickHouse] 查询最终失败: {e}") + finally: + if client: + try: + client.disconnect() + except Exception: + pass - # 重新创建连接 - try: - _clickhouse_client = _create_clickhouse_client() - print("[ClickHouse] 重连成功") - return _clickhouse_client - except Exception as reconnect_error: - print(f"[ClickHouse] 重连失败: {reconnect_error}") - _clickhouse_client = None - raise + raise last_error # ==================== 高频五档数据 ClickHouse HTTP 客户端(222.128.1.157:18123) ====================