更新ios
This commit is contained in:
80
app.py
80
app.py
@@ -8566,13 +8566,11 @@ def get_stock_quotes():
|
|||||||
return jsonify({'success': False, 'error': str(e)}), 500
|
return jsonify({'success': False, 'error': str(e)}), 500
|
||||||
|
|
||||||
|
|
||||||
# ==================== ClickHouse 连接池(带健康检查) ====================
|
# ==================== ClickHouse 连接管理(每次请求新建连接,更稳定) ====================
|
||||||
_clickhouse_client = None
|
|
||||||
_clickhouse_client_lock = threading.Lock()
|
|
||||||
|
|
||||||
def _create_clickhouse_client():
|
def _create_clickhouse_client():
|
||||||
"""创建新的 ClickHouse 客户端连接,并验证连接有效"""
|
"""创建新的 ClickHouse 客户端连接"""
|
||||||
client = Cclient(
|
return Cclient(
|
||||||
host='127.0.0.1',
|
host='127.0.0.1',
|
||||||
port=9000,
|
port=9000,
|
||||||
user='default',
|
user='default',
|
||||||
@@ -8583,52 +8581,52 @@ def _create_clickhouse_client():
|
|||||||
'send_receive_timeout': 300,
|
'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():
|
def get_clickhouse_client():
|
||||||
"""获取 ClickHouse 客户端(带健康检查和自动重连)"""
|
"""
|
||||||
global _clickhouse_client
|
获取 ClickHouse 客户端(每次创建新连接)
|
||||||
|
|
||||||
with _clickhouse_client_lock:
|
注意:调用方应在使用完毕后调用 client.disconnect() 释放连接,
|
||||||
# 如果客户端不存在,创建新连接
|
或使用 execute_clickhouse_query() 辅助函数自动管理连接
|
||||||
if _clickhouse_client is None:
|
"""
|
||||||
try:
|
return _create_clickhouse_client()
|
||||||
_clickhouse_client = _create_clickhouse_client()
|
|
||||||
print("[ClickHouse] 创建新连接成功")
|
|
||||||
return _clickhouse_client
|
|
||||||
except Exception as e:
|
|
||||||
print(f"[ClickHouse] 创建连接失败: {e}")
|
|
||||||
_clickhouse_client = None
|
|
||||||
raise
|
|
||||||
|
|
||||||
# 健康检查:尝试执行简单查询
|
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:
|
try:
|
||||||
_clickhouse_client.execute("SELECT 1")
|
client = _create_clickhouse_client()
|
||||||
return _clickhouse_client
|
result = client.execute(query, params) if params else client.execute(query)
|
||||||
|
return result
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[ClickHouse] 连接失效,正在重连: {e}")
|
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:
|
try:
|
||||||
_clickhouse_client.disconnect()
|
client.disconnect()
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
_clickhouse_client = None
|
|
||||||
|
|
||||||
# 重新创建连接
|
raise last_error
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
# ==================== 高频五档数据 ClickHouse HTTP 客户端(222.128.1.157:18123) ====================
|
# ==================== 高频五档数据 ClickHouse HTTP 客户端(222.128.1.157:18123) ====================
|
||||||
|
|||||||
Reference in New Issue
Block a user