From 8dea27c87b40bc353ca570a489c21b9051b00e5c Mon Sep 17 00:00:00 2001
From: PGijsbers
Date: Fri, 8 May 2026 12:05:27 +0200
Subject: [PATCH 1/3] use functools for caching instead of a module variable
---
src/database/setup.py | 30 ++++++++++++------------------
1 file changed, 12 insertions(+), 18 deletions(-)
diff --git a/src/database/setup.py b/src/database/setup.py
index f02f379..31ca6e3 100644
--- a/src/database/setup.py
+++ b/src/database/setup.py
@@ -1,11 +1,10 @@
+import functools
+
from sqlalchemy.engine import URL
from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine
from config import DatabaseConfiguration, get_config
-_user_engine = None
-_expdb_engine = None
-
def _create_engine(db_config: DatabaseConfiguration) -> AsyncEngine:
db_url = URL.create(
@@ -23,26 +22,21 @@ def _create_engine(db_config: DatabaseConfiguration) -> AsyncEngine:
)
+@functools.cache
def user_database() -> AsyncEngine:
- global _user_engine # noqa: PLW0603
- if _user_engine is None:
- _user_engine = _create_engine(get_config().openml_database)
- return _user_engine
+ return _create_engine(get_config().openml_database)
+@functools.cache
def expdb_database() -> AsyncEngine:
- global _expdb_engine # noqa: PLW0603
- if _expdb_engine is None:
- _expdb_engine = _create_engine(get_config().expdb_database)
- return _expdb_engine
+ return _create_engine(get_config().expdb_database)
async def close_databases() -> None:
"""Close all database connections."""
- global _user_engine, _expdb_engine # noqa: PLW0603
- if _user_engine is not None:
- await _user_engine.dispose()
- _user_engine = None
- if _expdb_engine is not None:
- await _expdb_engine.dispose()
- _expdb_engine = None
+ if user_database.cache_info().currsize == 1:
+ await user_database().dispose()
+ user_database.cache_clear()
+ if expdb_database.cache_info().currsize == 1:
+ await expdb_database().dispose()
+ expdb_database.cache_clear()
From 8a7beea8a80b0c4dcd60bf2d0b49cd393d42ab63 Mon Sep 17 00:00:00 2001
From: PGijsbers
Date: Fri, 8 May 2026 12:25:32 +0200
Subject: [PATCH 2/3] Log creation and disposing of database engines
---
src/database/setup.py | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/src/database/setup.py b/src/database/setup.py
index 31ca6e3..33a21fb 100644
--- a/src/database/setup.py
+++ b/src/database/setup.py
@@ -1,5 +1,6 @@
import functools
+from loguru import logger
from sqlalchemy.engine import URL
from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine
@@ -15,6 +16,8 @@ def _create_engine(db_config: DatabaseConfiguration) -> AsyncEngine:
port=db_config.port,
database=db_config.database,
)
+
+ logger.info("Creating database engine for {db_url}", db_url=db_url)
return create_async_engine(
db_url,
echo=db_config.echo,
@@ -34,9 +37,8 @@ def expdb_database() -> AsyncEngine:
async def close_databases() -> None:
"""Close all database connections."""
- if user_database.cache_info().currsize == 1:
- await user_database().dispose()
- user_database.cache_clear()
- if expdb_database.cache_info().currsize == 1:
- await expdb_database().dispose()
- expdb_database.cache_clear()
+ for db in (user_database, expdb_database):
+ if db.cache_info().currsize == 1:
+ logger.info("Disposing of engine connected to {db_url}", db_url=db().url)
+ await db().dispose()
+ db.cache_clear()
From 5d68b7be134a95ee687837334b4c61e0bf15d5b6 Mon Sep 17 00:00:00 2001
From: PGijsbers
Date: Tue, 12 May 2026 17:33:07 +0200
Subject: [PATCH 3/3] Make sure that dispose is called on all engines
---
src/database/setup.py | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/src/database/setup.py b/src/database/setup.py
index 33a21fb..cfd2306 100644
--- a/src/database/setup.py
+++ b/src/database/setup.py
@@ -39,6 +39,13 @@ async def close_databases() -> None:
"""Close all database connections."""
for db in (user_database, expdb_database):
if db.cache_info().currsize == 1:
- logger.info("Disposing of engine connected to {db_url}", db_url=db().url)
- await db().dispose()
+ engine = db()
+ logger.info("Disposing of engine connected to {db_url}", db_url=engine.url)
+ try:
+ await engine.dispose()
+ except Exception: # noqa: BLE001
+ logger.exception(
+ "Issue disposing of database engine for {db_url}",
+ db_url=engine.url,
+ )
db.cache_clear()