2025-07-15 17:08:42 +08:00
|
|
|
import asyncio
|
|
|
|
|
import time
|
|
|
|
|
|
|
|
|
|
from zhenxun.services.log import logger
|
|
|
|
|
|
|
|
|
|
from .config import (
|
|
|
|
|
DB_TIMEOUT_SECONDS,
|
|
|
|
|
LOG_COMMAND,
|
|
|
|
|
SLOW_QUERY_THRESHOLD,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def with_db_timeout(
|
2025-08-26 16:53:14 +08:00
|
|
|
coro,
|
|
|
|
|
timeout: float = DB_TIMEOUT_SECONDS,
|
|
|
|
|
operation: str | None = None,
|
|
|
|
|
source: str | None = None,
|
2025-07-15 17:08:42 +08:00
|
|
|
):
|
|
|
|
|
"""带超时控制的数据库操作"""
|
|
|
|
|
start_time = time.time()
|
|
|
|
|
try:
|
2025-08-26 16:53:14 +08:00
|
|
|
logger.debug(f"开始执行数据库操作: {operation} 来源: {source}")
|
2025-07-15 17:08:42 +08:00
|
|
|
result = await asyncio.wait_for(coro, timeout=timeout)
|
|
|
|
|
elapsed = time.time() - start_time
|
|
|
|
|
if elapsed > SLOW_QUERY_THRESHOLD and operation:
|
|
|
|
|
logger.warning(f"慢查询: {operation} 耗时 {elapsed:.3f}s", LOG_COMMAND)
|
|
|
|
|
return result
|
|
|
|
|
except asyncio.TimeoutError:
|
|
|
|
|
if operation:
|
2025-10-09 08:46:08 +08:00
|
|
|
logger.error(
|
|
|
|
|
f"数据库操作超时: {operation} (>{timeout}s) 来源: {source}",
|
|
|
|
|
LOG_COMMAND,
|
|
|
|
|
)
|
2025-07-15 17:08:42 +08:00
|
|
|
raise
|