Skip to main content

Django-conn-pool

MySQL Connection Pooling with Django(>2.0.0) and SQLAlchemy(>=1.2.7).

Why

If CONN_MAX_AGE not set in you settings, Django will establish a new MySQL connection for each request and close it after the request.

So if where are too many connections to be handled, it will establish too many connections until running out of MySQL max_connections.

Then, MySQL will return the error: ERROR 1040 (08004): Too many connections.

It's necessary to maintain a connection pool for a robust Django project.

Principle

Reference: MySQL Connection Pooling with Django and SQLAlchemy

Make MySQLdb Database get_new_connection from connection pool with SQLAlchemy QueuePool.

So all we need to custom a Database managed by connection pool and get new connection from the pool.

pip install mysqlclient
pip install SQLAlchemy

core code:

import MySQLdb as Database
import sqlalchemy.pool as pool
from sqlalchemy.pool import QueuePool
from django.db.backends.mysql.base import DatabaseWrapper as _DatabaseWrapper


Database = pool.manage(Database, poolclass=QueuePool, **settings.SQLALCHEMY_QUEUEPOOL)

class DatabaseWrapper(_DatabaseWrapper):

    def get_new_connection(self, conn_params):
        # return a mysql connection
        databases = settings.DATABASES
        alias = None
        for _alias in databases:
            if databases[_alias]['NAME'] == conn_params['db']:
                alias = _alias
                break
        client_flag = conn_params['client_flag']

        conn_params = databases[alias]
        return Database.connect(
            host=conn_params['HOST'],
            port=conn_params['PORT'],
            user=conn_params['USER'],
            db=conn_params['NAME'],
            passwd=conn_params['PASSWORD'],
            use_unicode=True,
            charset='utf8',
            client_flag=client_flag,
            sql_mode='STRICT_TRANS_TABLES',
        )

Usage

pip install django-conn-pool

settings.py

# http://docs.sqlalchemy.org/en/latest/core/pooling.html#sqlalchemy.pool.QueuePool
# http://docs.sqlalchemy.org/en/latest/core/pooling.html#sqlalchemy.pool.Pool.params
SQLALCHEMY_QUEUEPOOL = {
    'pool_size': 10,
    'max_overflow': 10,
    'timeout': 5,
    'recycle': 119,
}

DATABASES = {
    'default': {
        'ENGINE': 'django_conn_pool.mysql',
        'HOST': '127.0.0.1',
        'NAME': 'xxx',
        'USER': 'xxx',
        'PASSWORD': 'xxx',
        'PORT': 3306,
    },
    'other': {
        'ENGINE': 'django_conn_pool.mysql',
        'HOST': '127.0.0.1',
        'NAME': 'xxx',
        'USER': 'xxx',
        'PASSWORD': 'xxx',
        'PORT': 3306,
    },
}

Test

If python manage.py runserver is OK, now you can use load testing utility Siege to test.

siege -r 2 -c 1000 -d 0 http://xxx  # siege --help

You can compare the MySQL process list count to the before, and it should work.

Btw, you should get a sqlalchemy.exc.TimeoutError: exception if it does not get a connection during the request.

Metadata

Release files for django-conn-pool 2.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-conn-pool 2.1.0
File Size Uploaded
django-conn-pool-2.1.0.tar.gz 3.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for django-conn-pool 2.1.0
File Interpreter ABI Platform
django_conn_pool-2.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 8.9 kB

Release files / django-conn-pool-2.1.0.tar.gz

Download URL django-conn-pool-2.1.0.tar.gz
Size 3.7 kB
Tags Source
SHA-256 checksum
How to use checksums
69ae893787f4c9af436d40a8d31c47f0c5d2d7b1fa84eaea661bcaab339cb538
BLAKE2b-256 checksum
How to use checksums
e15153330138e8466d183a1f21916f437b5310f57a05a9408eb50745da27600e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/42.0.2 requests-toolbelt/0.9.1 tqdm/4.40.2 CPython/3.6.5

Release files / django_conn_pool-2.1.0-py3-none-any.whl

Download URL django_conn_pool-2.1.0-py3-none-any.whl
Size 5.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ebf3878e7a4bce28309d68fc2ca52ab0b1baa15a91f1eaea2b1db1addc67ce66
BLAKE2b-256 checksum
How to use checksums
1efe5dac30faa65b97c6c85cefef97627b296eb29adc7eae1e1c7578af14f61c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/42.0.2 requests-toolbelt/0.9.1 tqdm/4.40.2 CPython/3.6.5

Release history Release notifications | RSS feed

This release

2.1.0 This release

2 release files

2.0.3

2 release files

2.0.2

2 release files

1.11.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page