goon/app/db.py
goon-foss 2a2c0d7e9d
Some checks failed
Backend tests / test (push) Has been cancelled
fix(api): bez planow ogolnych i szybkie listy serwisow, ktore stoja
- db: prepare_threshold=None. psycopg przygotowywal zapytanie po 5 wykonaniach na
  polaczeniu, a Postgres przechodzil potem na plan ogolny. Lista duzego tagu na takim
  planie: "pov" 44 s zamiast 0,46 s, "masturbation" 46 s zamiast 0,18 s. Stad listy
  ladowaly sie raz szybko, raz minute, zaleznie od polaczenia z puli (tez GOON-73/75).
- Lista jednego serwisu bez frazy: przejscie od najnowszych z limitem 1 s, a po nim
  start od scen serwisu (do 150 tys.). Serwis, ktory stoi, mial sceny gleboko:
  superporn 72-92 s -> 1,7 s, yespornvip 15 s -> 1,5 s, hentaiplay 9 s -> 0,06 s.

Porownanie ze starym kodem na 88 listach serwisow: wyniki identyczne przy
zapytaniach puszczonych po sobie.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 09:45:05 +02:00

41 lines
1.2 KiB
Python

from collections.abc import Iterator
from contextlib import contextmanager
from sqlalchemy import create_engine
from sqlalchemy.orm import Session, sessionmaker
from app.config import get_settings
_settings = get_settings()
# prepare_threshold=None: psycopg domyslnie przygotowuje zapytanie po 5 wykonaniach na
# polaczeniu, a Postgres po kolejnych 5 potrafi przejsc na plan ogolny, niezalezny od
# parametrow. Dla list tagu to katastrofa: plan dobry dla malego tagu na duzym ("pov")
# trwal 44 s zamiast 0,46 s (pomiar 2026-09-23), wiec lista ladowala sie raz szybko, raz
# minute, zaleznie od tego, ktore polaczenie z puli trafilo. Planowanie od nowa to kilka ms.
engine = create_engine(
_settings.database_url,
pool_pre_ping=True,
future=True,
connect_args={"prepare_threshold": None},
)
SessionLocal = sessionmaker(bind=engine, autoflush=False, expire_on_commit=False, future=True)
@contextmanager
def session_scope() -> Iterator[Session]:
session = SessionLocal()
try:
yield session
session.commit()
except Exception:
session.rollback()
raise
finally:
session.close()
def get_session() -> Iterator[Session]:
with session_scope() as session:
yield session