Automatically try to re-establish Django database connections when they fail due to DNS errors.
When the Django app (dbconnectionretrier
) loads, a hook is installed in Django's BaseDatabaseWrapper.ensure_connection
that catches django.db.OperationalError
. If the error raised is a DNS error, the connction attempt is retried synchronously three times.
Tested on Django 2.0-2.3 and Python 3.7 and 3.8. Might work with other versions of Django and Python.
-
Install the package from PyPi:
$ pip install django-db-connection-retrier
-
Add
dbconnectionretrier
to yourINSTALLED_APPS
:INSTALLED_APPS = [ 'dbconnectionretrier', ... ]
Adding dbconnectionretrier
to INSTALLED_APPS
enables automatic connection retrying. Want more granular control over patching?
from dbconnectionretrier.patch import patch_ensure_connection
# after this line executes, connection retrying is enabled
patch = patch_ensure_connection()
# after this line, the connection retrying is disabled
patch.rollback()
from dbconnectionretrier.patch import patch_ensure_connection_contextual
with patch_ensure_connection_contextual():
# all code inside this block benefits from connection retrying