51 lines
1.2 KiB
Python
51 lines
1.2 KiB
Python
import asyncio
|
|
|
|
from sqlalchemy import text
|
|
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine
|
|
from sqlalchemy.orm import declarative_base
|
|
|
|
from config import DATABASE_URL, DB_MAX_OVERFLOW, DB_POOL_SIZE
|
|
|
|
|
|
CONCURRENT_UPDATES_LIMIT = DB_POOL_SIZE + DB_MAX_OVERFLOW
|
|
MAX_UPDATE_AGE_SEC = 28
|
|
CONCURRENT_UPDATES_WAIT_TIMEOUT_SEC = 8
|
|
CONCURRENT_UPDATES_GATE_LIMIT = 150
|
|
CONCURRENT_UPDATES_GATE_WAIT_SEC = 2
|
|
|
|
engine = create_async_engine(
|
|
DATABASE_URL,
|
|
echo=False,
|
|
future=True,
|
|
pool_size=DB_POOL_SIZE,
|
|
max_overflow=DB_MAX_OVERFLOW,
|
|
pool_timeout=60,
|
|
pool_pre_ping=True,
|
|
pool_recycle=300,
|
|
)
|
|
|
|
async_session_maker = async_sessionmaker(
|
|
bind=engine,
|
|
expire_on_commit=False,
|
|
class_=AsyncSession,
|
|
)
|
|
|
|
Base = declarative_base()
|
|
|
|
WARM_POOL_COUNT = 10
|
|
|
|
|
|
async def warm_pool() -> None:
|
|
"""
|
|
Прогревает пул соединений при старте.
|
|
"""
|
|
|
|
async def _one() -> None:
|
|
async with async_session_maker() as session:
|
|
await session.execute(text("SELECT 1"))
|
|
|
|
count = min(WARM_POOL_COUNT, DB_POOL_SIZE)
|
|
if count <= 0:
|
|
return
|
|
await asyncio.gather(*[asyncio.create_task(_one()) for _ in range(count)])
|