From 90bc9fe625ac800417e68ae9a9e2018ccba96241 Mon Sep 17 00:00:00 2001 From: CebullaD Date: Tue, 1 Apr 2025 19:35:34 +0200 Subject: [PATCH 1/3] Convert pooling ENV to integer --- qwc_services_core/database.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/qwc_services_core/database.py b/qwc_services_core/database.py index 583d8d1..187abce 100644 --- a/qwc_services_core/database.py +++ b/qwc_services_core/database.py @@ -18,10 +18,10 @@ def db_engine(self, conn_str): see https://docs.sqlalchemy.org/en/latest/core/engines.html#postgresql """ - db_pool_size = os.environ.get('POOL_SIZE', 5) - db_max_overflow = os.environ.get('MAX_OVERFLOW', 10) - db_pool_timeout = os.environ.get('POOL_TIMEOUT', 30) - db_pool_recycle = os.environ.get('POOL_RECYCLE', -1) + db_pool_size = int(os.environ.get('POOL_SIZE', 5)) + db_max_overflow = int(os.environ.get('MAX_OVERFLOW', 10)) + db_pool_timeout = int(os.environ.get('POOL_TIMEOUT', 30)) + db_pool_recycle = int(os.environ.get('POOL_RECYCLE', -1)) engine = self.engines.get(conn_str) if not engine: From d305c17c5074dab257f4760d198e029cccccd6bb Mon Sep 17 00:00:00 2001 From: CebullaD Date: Tue, 1 Apr 2025 19:36:50 +0200 Subject: [PATCH 2/3] Add ENV to enable db pooling --- README.md | 1 + qwc_services_core/database.py | 21 +++++++++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index f9818d0..faf698d 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ Environment variables | `TENANT_HEADER` | `` | The name of the HTTP header which contains the tenant name for multi-tenant setups. | | `TENANT_PATH_PREFIX` | `@service_prefix@/@tenant@` | URL path prefix for all QWC services for multi-tenant setups. | | `TENANT_ACCESS_COOKIE_PATH` | `` | Path for which the access cookie is valid for multi-tenant setups. | +| `ENABLE_POOLING` | `False` | Enable db connection pooling. Defaults are used, if the following ENV are not set. | | `POOL_SIZE` | `5` | Maximum number of possible data base connections. | | `MAX_OVERFLOW` | `10` | Additional connections beyond pool_size during peak load. | | `POOL_TIMEOUT` | `30` | Time (in seconds) to wait for a connection to become available. | diff --git a/qwc_services_core/database.py b/qwc_services_core/database.py index 187abce..e84489b 100644 --- a/qwc_services_core/database.py +++ b/qwc_services_core/database.py @@ -18,6 +18,7 @@ def db_engine(self, conn_str): see https://docs.sqlalchemy.org/en/latest/core/engines.html#postgresql """ + db_enable_pooling = os.environ.get('ENABLE_POOLING', False) db_pool_size = int(os.environ.get('POOL_SIZE', 5)) db_max_overflow = int(os.environ.get('MAX_OVERFLOW', 10)) db_pool_timeout = int(os.environ.get('POOL_TIMEOUT', 30)) @@ -25,14 +26,18 @@ def db_engine(self, conn_str): engine = self.engines.get(conn_str) if not engine: - engine = create_engine( - conn_str, - poolclass=QueuePool, - pool_size=db_pool_size, - max_overflow=db_max_overflow, - pool_timeout=db_pool_timeout, - pool_recycle=db_pool_recycle, - pool_pre_ping=True, echo=False) + if db_enable_pooling: + engine = create_engine( + conn_str, + poolclass=QueuePool, + pool_size=db_pool_size, + max_overflow=db_max_overflow, + pool_timeout=db_pool_timeout, + pool_recycle=db_pool_recycle, + pool_pre_ping=True, echo=False) + else: + engine = create_engine( + conn_str, pool_pre_ping=True, echo=False) self.engines[conn_str] = engine return engine From f4a71d5a844c5b59b326b347d8815acf741528a3 Mon Sep 17 00:00:00 2001 From: Sandro Mani Date: Thu, 3 Apr 2025 11:32:19 +0200 Subject: [PATCH 3/3] Update database.py --- qwc_services_core/database.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qwc_services_core/database.py b/qwc_services_core/database.py index e84489b..ed4ef1f 100644 --- a/qwc_services_core/database.py +++ b/qwc_services_core/database.py @@ -18,7 +18,7 @@ def db_engine(self, conn_str): see https://docs.sqlalchemy.org/en/latest/core/engines.html#postgresql """ - db_enable_pooling = os.environ.get('ENABLE_POOLING', False) + db_enable_pooling = os.environ.get('ENABLE_POOLING', 'False').lower() in ('t', 'true') db_pool_size = int(os.environ.get('POOL_SIZE', 5)) db_max_overflow = int(os.environ.get('MAX_OVERFLOW', 10)) db_pool_timeout = int(os.environ.get('POOL_TIMEOUT', 30))