diff --git a/web/lm_unit.py b/web/lm_unit.py index f51e8c3..46f274b 100644 --- a/web/lm_unit.py +++ b/web/lm_unit.py @@ -10,6 +10,7 @@ import web.middleware.auth_merger import web.middleware.json_params import web.middleware.json_response +import web.middleware.disuse_db_conn_response import web.module.capabilities import web.module.machines import web.module.requests @@ -97,5 +98,10 @@ async def obtain_request(request): else: logger.info(f'<< obtained') +if settings.app['db']['sanic_fresh_db_each_request']: + lm_unit_webserver.register_middleware( + web.middleware.disuse_db_conn_response.disuse_db_conn_response, + 'response' + ) lm_unit_webserver.config.KEEP_ALIVE = settings.app['sanic_keepalive'] diff --git a/web/middleware/disuse_db_conn_response.py b/web/middleware/disuse_db_conn_response.py new file mode 100644 index 0000000..e79f2f8 --- /dev/null +++ b/web/middleware/disuse_db_conn_response.py @@ -0,0 +1,9 @@ +from web.modeltr.connection import Connection + + +async def disuse_db_conn_response(request, response): + try: + Connection.disuse() + except: + pass + diff --git a/web/modeltr/connection.py b/web/modeltr/connection.py index 6fd3a32..475c8ca 100644 --- a/web/modeltr/connection.py +++ b/web/modeltr/connection.py @@ -136,6 +136,15 @@ def _connect(self): raise DbConnectionError("Connection to the DB wasn't successful [async mode]") self._last_usage_timestamp = time.time() + def _disconnect(self): + try: + if self.client is not None: + self.client.close() + self.acursor = None + self.client = None + except Exception: + self.__logger.warning('Error disconnecting the db server', exc_info=True) + def _refresh_conn_on_every_usage(self): return "socket_reusability" in self._connection_params and \ self._connection_params["socket_reusability"] == "never" @@ -240,3 +249,17 @@ def use(cls, alias=DEFAULT_CONNECTION_NAME): f'Exception when calling use(): {repr(ex)}', exc_info=True ) return connection["connection"] + + @classmethod + def disuse(cls, alias=DEFAULT_CONNECTION_NAME): + if alias not in cls.__connections: + raise ValueError(f'connection {alias} has not been initialized before, ' + f'please use connect method') + + connection = cls.__connections[alias] + try: + connection["connection"]._disconnect() + except Exception as ex: + logging.getLogger(__name__).error( + f'Exception when calling use(): {repr(ex)}', exc_info=True + ) diff --git a/web/settings.py b/web/settings.py index 9a90073..a6e5802 100644 --- a/web/settings.py +++ b/web/settings.py @@ -38,6 +38,7 @@ class Settings: 'username': None, 'password': None, 'socket_reusability': 'never', + 'sanic_fresh_db_each_request': False, 'async_polling': { "sleep_time": 0.2, "warning_time": 10,