Ich habe zwei Wrapper -Funktionen, um eine Engine, einen SessionMaker und eine Sitzung zu erstellen: < /p>
Code: Select all
@functools.lru_cache(maxsize=None)
def _get_sessionmaker() -> sessionmaker:
engine = get_engine()
sessionfactory = sessionmaker(bind=engine)
return sessionfactory
@functools.lru_cache(maxsize=None)
def get_session() -> Session:
return _get_sessionmaker()()
Ich nenne dies in der Funktion myfun () mit einem Kontext -Manager. Ich erwarte daher, dass die Sitzung ordnungsgemäß schließt:
Code: Select all
def myfun():
with get_session() as session, session.begin():
# do some query
Ich habe jedoch festgestellt, dass die Sitzung/Verbindung nicht ordnungsgemäß geschlossen/zurückgegeben wird (siehe Test unten). (Dies sollte nicht der Fall sein, denn irgendwann habe ich ein
Problem mit zu vielen Verbindungen auf meinem Server.) Warum möchte ich dieses Verhalten verstehen. Wenn ich es einfach ohne Wrapper ausführe, gibt es kein Problem: < /p>
Code: Select all
def myfun_withoutwrapper():
engine = get_engine()
Session = sessionmaker(bind=engine)
with Session() as session, session.begin():
# some query
< /code>
Danke! der folgende Code: < /p>
# test number of connections before and after
engine = get_engine()
count_sql = """SELECT COUNT(*) FROM pg_stat_activity;"""
with engine.connect() as conn:
pre_count_df = pd.read_sql(count_sql, conn)
# run myfun()
_ = my_fun()
with engine.connect() as conn:
post_count_df = pd.read_sql(count_sql, conn)
Was ich bekomme, ist ein Unterschied von 1, d. H. Nach dem Ausführen von myfun () habe ich eine Verbindung mehr, was nicht der Fall sein sollte. (Als Beweis habe ich den gleichen Zähltest durchgeführt, ohne myfun () aufzurufen, und ich habe die gleiche Anzahl von Verbindungen erhalten. Der Unterschied von 1 kommt also definitiv von myfun () , unabhängig davon, wie oft Ich reite es aus.)
Ich benutze Python 3.12.8, Sqlalchemy 2.0.38, mit einer Postgres 16 -Datenbank.