refactor(db): 统一引擎为进程级单例,同一 URL 只一个连接池

此前同一 DATABASE_URL 存在 3 个独立 engine(db 主 engine、
repositories._shared_engine、park._ASYNC_ENGINE),各自 20+20 池,
理论连接上限 120,池间不互济,仍有满载风险。

- _shared_engine:URL==config.DATABASE_URL 时直接复用 db 模块级 engine
- park/tenants._get_session:同样复用主 engine
- 收敛后同一 URL 进程内仅一个池(上限 40),连接数可控、池可互济
This commit is contained in:
Pine
2026-09-10 22:52:19 +08:00
parent 396f98c9c5
commit ef57e51ef0
2 changed files with 8 additions and 1 deletions
+5
View File
@@ -3353,6 +3353,11 @@ _SHARED_ENGINES: dict[str, "object"] = {}
def _shared_engine(url: str):
# 统一引擎:主库 URL 直接复用 db 模块级单例 engine(同一进程同一 URL 只有一个
# 连接池,避免多 engine 多池叠加导致连接数倍增 / 池不互济再满载)。
if url == config.DATABASE_URL:
from .db import engine as _main_engine
return _main_engine
eng = _SHARED_ENGINES.get(url)
if eng is None:
from .db import make_async_engine
+3 -1
View File
@@ -41,7 +41,9 @@ _ASYNC_ENGINE = None
def _get_session() -> AsyncSession:
global _ASYNC_ENGINE
if _ASYNC_ENGINE is None:
_ASYNC_ENGINE = make_async_engine(DATABASE_URL)
# 统一引擎:复用 db 模块级单例 engine(同一 URL 同一池,不另开池)
from ..infrastructure.db import engine as _main_engine
_ASYNC_ENGINE = _main_engine
return async_sessionmaker(bind=_ASYNC_ENGINE, expire_on_commit=False)()