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:
@@ -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
@@ -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)()
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user