fix+perf: SQLite连接busy_timeout修复并发锁/静态版本号缓存/删除资产批量清理/安全检查最新记录子查询修正/AI余额与SSL探测并发化/密钥常量时间比较
This commit is contained in:
+13
-9
@@ -16,26 +16,26 @@ DATA_DIR.mkdir(parents=True, exist_ok=True)
|
||||
ASSETS_DB_URL = f"sqlite:///{DATA_DIR / 'assets.db'}"
|
||||
METRICS_DB_URL = f"sqlite:///{DATA_DIR / 'metrics.db'}"
|
||||
|
||||
# timeout:sqlite3 内置 busy 等待(秒),随连接创建生效。
|
||||
# SQLite 默认使用 NullPool(每请求新建连接),PRAGMA busy_timeout 只在单连接有效,
|
||||
# 必须通过 connect_args 传递,否则并发写入(Agent 上报 + 清理任务)会报 database is locked。
|
||||
assets_engine = create_engine(
|
||||
ASSETS_DB_URL,
|
||||
echo=False,
|
||||
connect_args={"check_same_thread": False},
|
||||
pool_pre_ping=True,
|
||||
connect_args={"check_same_thread": False, "timeout": 30},
|
||||
)
|
||||
metrics_engine = create_engine(
|
||||
METRICS_DB_URL,
|
||||
echo=False,
|
||||
connect_args={"check_same_thread": False},
|
||||
pool_pre_ping=True,
|
||||
connect_args={"check_same_thread": False, "timeout": 30},
|
||||
)
|
||||
|
||||
|
||||
def _enable_wal(engine) -> None:
|
||||
"""启用 WAL 模式,提升 SQLite 并发读写能力"""
|
||||
"""启用 WAL 模式,提升 SQLite 并发读写能力(journal_mode 持久化到库文件,设置一次即可)"""
|
||||
import sqlalchemy as sa
|
||||
with engine.connect() as conn:
|
||||
conn.execute(sa.text("PRAGMA journal_mode=WAL"))
|
||||
conn.execute(sa.text("PRAGMA busy_timeout=5000"))
|
||||
|
||||
|
||||
_enable_wal(assets_engine)
|
||||
@@ -152,12 +152,16 @@ def _backfill_provider_services(conn) -> None:
|
||||
|
||||
|
||||
def get_session() -> Generator[Session, None, None]:
|
||||
"""资产库会话(默认)"""
|
||||
with Session(assets_engine) as session:
|
||||
"""资产库会话(默认)
|
||||
|
||||
expire_on_commit=False:commit 后不失效对象属性,避免后续访问触发隐式
|
||||
重新加载查询;需要最新值的场景由调用方显式 session.refresh()。
|
||||
"""
|
||||
with Session(assets_engine, expire_on_commit=False) as session:
|
||||
yield session
|
||||
|
||||
|
||||
def get_metrics_session() -> Generator[Session, None, None]:
|
||||
"""监控 / 日志库会话"""
|
||||
with Session(metrics_engine) as session:
|
||||
with Session(metrics_engine, expire_on_commit=False) as session:
|
||||
yield session
|
||||
|
||||
Reference in New Issue
Block a user