diff --git a/README.md b/README.md index 9a6f5ea..f9818d0 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,10 @@ 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. | +| `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. | +| `POOL_RECYCLE` | `-1` | Time (in seconds) after idle connections will be resetted. | Development =========== diff --git a/qwc_services_core/database.py b/qwc_services_core/database.py index c6241b0..583d8d1 100644 --- a/qwc_services_core/database.py +++ b/qwc_services_core/database.py @@ -1,7 +1,7 @@ import os from sqlalchemy import create_engine - +from sqlalchemy.pool import QueuePool class DatabaseEngine(): """Helper for database connections using SQLAlchemy engines""" @@ -15,12 +15,24 @@ def db_engine(self, conn_str): :param str conn_str: DB connection string for SQLAlchemy engine - see http://docs.sqlalchemy.org/en/latest/core/engines.html#postgresql + 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) + engine = self.engines.get(conn_str) if not engine: engine = create_engine( - conn_str, pool_pre_ping=True, echo=False) + 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) self.engines[conn_str] = engine return engine