Fixed django database connection leaking in child threads

This commit is contained in:
M1ha-Shvn 2021-03-31 18:35:00 +05:00
parent 96dc1630d7
commit bb9db1e9a7

View File

@ -172,11 +172,28 @@ class ExceptionThread(Thread):
super(ExceptionThread, self).__init__(*args, **kwargs) super(ExceptionThread, self).__init__(*args, **kwargs)
self.exc = None self.exc = None
def _close_django_db_connections(self):
"""
In Django every thread has its own database connection pool.
But django does not close them automatically in child threads.
As a result, this can cause database connection leaking.
Here we close connections manually when thread execution is finished.
"""
try:
from django.db import connections as db_connections
except (ModuleNotFoundError, ImportError):
db_connections = None
if db_connections:
db_connections.close_all()
def run(self): def run(self):
try: try:
return super(ExceptionThread, self).run() return super(ExceptionThread, self).run()
except Exception as e: except Exception as e:
self.exc = e self.exc = e
finally:
self._close_django_db_connections()
def join(self, timeout=None): def join(self, timeout=None):
super(ExceptionThread, self).join(timeout=timeout) super(ExceptionThread, self).join(timeout=timeout)