{ "info": { "author": "kerol", "author_email": "ikerol@163.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "### Django-conn-pool\nMySQL Connection Pooling with Django(>2.0.0) and SQLAlchemy(>=1.2.7).\n\n### Why\nIf `CONN_MAX_AGE` not set in you settings, Django will establish a new MySQL connection for each request and close it after the request.\n\nSo if where are too many connections to be handled, it will establish too many connections until running out of MySQL `max_connections`.\n\nThen, MySQL will return the error: `ERROR 1040 (08004): Too many connections`.\n\nIt's necessary to maintain a connection pool for a robust Django project.\n\n### Principle\n[Reference: MySQL Connection Pooling with Django and SQLAlchemy](http://menendez.com/blog/mysql-connection-pooling-django-and-sqlalchemy/)\n\nMake MySQLdb Database `get_new_connection` from connection pool with SQLAlchemy QueuePool.\n\nSo all we need to custom a Database managed by connection pool and get new connection from the pool.\n\n```\npip install mysqlclient\npip install SQLAlchemy\n```\n\n**core code**:\n\n```\nimport MySQLdb as Database\nimport sqlalchemy.pool as pool\nfrom sqlalchemy.pool import QueuePool\nfrom django.db.backends.mysql.base import DatabaseWrapper as _DatabaseWrapper\n\n\nDatabase = pool.manage(Database, poolclass=QueuePool, **settings.SQLALCHEMY_QUEUEPOOL)\n\nclass DatabaseWrapper(_DatabaseWrapper):\n\n def get_new_connection(self, conn_params):\n # return a mysql connection\n databases = settings.DATABASES\n alias = None\n for _alias in databases:\n if databases[_alias]['NAME'] == conn_params['db']:\n alias = _alias\n break\n client_flag = conn_params['client_flag']\n\n conn_params = databases[alias]\n return Database.connect(\n host=conn_params['HOST'],\n port=conn_params['PORT'],\n user=conn_params['USER'],\n db=conn_params['NAME'],\n passwd=conn_params['PASSWORD'],\n use_unicode=True,\n charset='utf8',\n client_flag=client_flag,\n sql_mode='STRICT_TRANS_TABLES',\n )\n```\n\n### Usage\n\n```\npip install django-conn-pool\n```\n\nsettings.py\n\n```\n# http://docs.sqlalchemy.org/en/latest/core/pooling.html#sqlalchemy.pool.QueuePool\n# http://docs.sqlalchemy.org/en/latest/core/pooling.html#sqlalchemy.pool.Pool.params\nSQLALCHEMY_QUEUEPOOL = {\n 'pool_size': 10,\n 'max_overflow': 10,\n 'timeout': 5,\n 'recycle': 119,\n}\n\nDATABASES = {\n 'default': {\n 'ENGINE': 'django_conn_pool.mysql',\n 'HOST': '127.0.0.1',\n 'NAME': 'xxx',\n 'USER': 'xxx',\n 'PASSWORD': 'xxx',\n 'PORT': 3306,\n },\n 'other': {\n 'ENGINE': 'django_conn_pool.mysql',\n 'HOST': '127.0.0.1',\n 'NAME': 'xxx',\n 'USER': 'xxx',\n 'PASSWORD': 'xxx',\n 'PORT': 3306,\n },\n}\n```\n\n\n### Test\nIf `python manage.py runserver` is OK, now you can use load testing utility [Siege](https://www.joedog.org/siege-home/) to test.\n\n```\nsiege -r 2 -c 1000 -d 0 http://xxx # siege --help\n```\n\nYou can compare the MySQL process list count to the before, and it should work.\n\nBtw, you should get a `sqlalchemy.exc.TimeoutError:` exception if it does not get a connection during the request.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/kerol/django-conn-pool", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "django-conn-pool", "package_url": "https://pypi.org/project/django-conn-pool/", "platform": "", "project_url": "https://pypi.org/project/django-conn-pool/", "project_urls": { "Homepage": "https://github.com/kerol/django-conn-pool" }, "release_url": "https://pypi.org/project/django-conn-pool/2.0.3/", "requires_dist": [ "Django (>2.0.0)", "SQLAlchemy (>=1.2.7)" ], "requires_python": "", "summary": "Connection Pooling with Django and SQLAlchemy", "version": "2.0.3" }, "last_serial": 3920046, "releases": { "1.11.1": [ { "comment_text": "", "digests": { "md5": "3fc0eaf3e0232ceb08cac88642460c83", "sha256": "196bfde83f829bf20894fe2ef5a2ab8404be250727db5dcef6affb497c50f2fb" }, "downloads": -1, "filename": "django_conn_pool-1.11.1-py3-none-any.whl", "has_sig": false, "md5_digest": "3fc0eaf3e0232ceb08cac88642460c83", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5236, "upload_time": "2018-05-29T12:42:53", "url": "https://files.pythonhosted.org/packages/d0/2c/b6fe0485a6e52ed1c709f4f59ea644cc5e14706293c949c9c148f66b627a/django_conn_pool-1.11.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4ed5221e713ed66283cf3b8be70e28d4", "sha256": "8c4c3bfc870da2cdd960c0f02913d3e07ebf913f3acc25ea5c9e61ab57bdf8e8" }, "downloads": -1, "filename": "django-conn-pool-1.11.1.tar.gz", "has_sig": false, "md5_digest": "4ed5221e713ed66283cf3b8be70e28d4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4326, "upload_time": "2018-05-29T12:42:55", "url": "https://files.pythonhosted.org/packages/fa/8e/cec86a3f53551de82a2f58ee8e8782c07eef2ac86afb7d899f4334e9a8ce/django-conn-pool-1.11.1.tar.gz" } ], "2.0.2": [ { "comment_text": "", "digests": { "md5": "16235c13c903155fb8e12c8952bbb432", "sha256": "5ce4c833dbe307193486683999529de2edbc351a80def4d8c8a1f21e4e1e83d4" }, "downloads": -1, "filename": "django_conn_pool-2.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "16235c13c903155fb8e12c8952bbb432", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5580, "upload_time": "2018-05-30T13:24:02", "url": "https://files.pythonhosted.org/packages/10/20/6a683a37239e230437363f3e7f2e593d2dc7b91a6c68111b6f542dfcaddd/django_conn_pool-2.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e9df7783fd7c9ead84aae72ea7dc8f70", "sha256": "849155fc928896c90243fb5358bc961f85fba2440a3eb80a53de7433b61d46b0" }, "downloads": -1, "filename": "django-conn-pool-2.0.2.tar.gz", "has_sig": false, "md5_digest": "e9df7783fd7c9ead84aae72ea7dc8f70", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3491, "upload_time": "2018-05-30T13:24:03", "url": "https://files.pythonhosted.org/packages/21/bf/f32d6d10d5127083bd881c331a05ca248be3cf21ed66a482c7a9188b0f14/django-conn-pool-2.0.2.tar.gz" } ], "2.0.3": [ { "comment_text": "", "digests": { "md5": "16631e104189ce5571df4f640f60db5d", "sha256": "4da37d2b0b1572a5bbb06afa5068cd567146fbfcd3311bdb4bd0d2ea7a4c2a0b" }, "downloads": -1, "filename": "django_conn_pool-2.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "16631e104189ce5571df4f640f60db5d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5594, "upload_time": "2018-06-01T09:15:42", "url": "https://files.pythonhosted.org/packages/fd/fa/b9305827278ef36ac2c2671f2ef564f1651186ab49a8c80b85395d1622ff/django_conn_pool-2.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0226d764888ffc9ad47d3ccc44ea7763", "sha256": "0bc1c0c707e99e8da4dcb6ffd88d12026ccc6bf31f1fa8c63a15190ce10235f7" }, "downloads": -1, "filename": "django-conn-pool-2.0.3.tar.gz", "has_sig": false, "md5_digest": "0226d764888ffc9ad47d3ccc44ea7763", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3507, "upload_time": "2018-06-01T09:15:44", "url": "https://files.pythonhosted.org/packages/78/d7/b9529e10405fdff3476530addf3589fe771620206c63e58217c672e32606/django-conn-pool-2.0.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "16631e104189ce5571df4f640f60db5d", "sha256": "4da37d2b0b1572a5bbb06afa5068cd567146fbfcd3311bdb4bd0d2ea7a4c2a0b" }, "downloads": -1, "filename": "django_conn_pool-2.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "16631e104189ce5571df4f640f60db5d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5594, "upload_time": "2018-06-01T09:15:42", "url": "https://files.pythonhosted.org/packages/fd/fa/b9305827278ef36ac2c2671f2ef564f1651186ab49a8c80b85395d1622ff/django_conn_pool-2.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0226d764888ffc9ad47d3ccc44ea7763", "sha256": "0bc1c0c707e99e8da4dcb6ffd88d12026ccc6bf31f1fa8c63a15190ce10235f7" }, "downloads": -1, "filename": "django-conn-pool-2.0.3.tar.gz", "has_sig": false, "md5_digest": "0226d764888ffc9ad47d3ccc44ea7763", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3507, "upload_time": "2018-06-01T09:15:44", "url": "https://files.pythonhosted.org/packages/78/d7/b9529e10405fdff3476530addf3589fe771620206c63e58217c672e32606/django-conn-pool-2.0.3.tar.gz" } ] }