fix: единый singleton engine в bd, убраны 17 локальных make_engine()
- bd/__init__.py: добавлены get_engine() и get_session() — один SQLAlchemy engine на весь процесс - make_engine(): pool_size=5, max_overflow=5, pool_timeout=30, pool_recycle=1800 - Все 17 route-файлов: убраны локальные get_session()/make_engine(), импорт из bd - transfer_crud.py: _get_session() → get_session() из bd - init_data_base.py: get_engine() вместо make_engine() - Результат: 78 idle соединений → 1
This commit is contained in:
@@ -47,7 +47,11 @@ def make_engine():
|
||||
s.DATABASE_URL_syncpg,
|
||||
connect_args=s.PG8000_CONNECT_ARGS,
|
||||
future=True,
|
||||
pool_pre_ping=True, # проверяет соединение перед каждым запросом
|
||||
pool_pre_ping=True,
|
||||
pool_size=5,
|
||||
max_overflow=5,
|
||||
pool_timeout=30,
|
||||
pool_recycle=1800,
|
||||
)
|
||||
|
||||
|
||||
@@ -70,3 +74,22 @@ def wait_for_db(retries: int = 15, delay: float = 2.0) -> None:
|
||||
if attempt < retries:
|
||||
time.sleep(delay)
|
||||
raise RuntimeError("PostgreSQL did not become ready in time.")
|
||||
|
||||
# ── Singleton engine + session factory (один движок на весь процесс) ───────
|
||||
_engine = None
|
||||
_SessionFactory = None
|
||||
|
||||
|
||||
def get_engine():
|
||||
global _engine
|
||||
if _engine is None:
|
||||
_engine = make_engine()
|
||||
return _engine
|
||||
|
||||
|
||||
def get_session():
|
||||
global _SessionFactory
|
||||
if _SessionFactory is None:
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
_SessionFactory = sessionmaker(bind=get_engine(), future=True)
|
||||
return _SessionFactory
|
||||
|
||||
Reference in New Issue
Block a user