django 重写 mysql 连接库实现连接池
问题
django 项目使用 gunicorn + gevent 部署,并设置 CONN_MAX_AGE 会导致 mysql 数据库连接数飙升,在高并发模式可能会出现 too many connections 错误。该怎么解决这个问题呢?首先看下 django 源码,找到问题的根源。
本文 django 版本为 2.2.3。
问题分析
首先查看连接部分源码:
# django/db/backends/mysql/base.py
class DatabaseWrapper(BaseDatabaseWrapper):
vendor = 'mysql'
...
...
...
def get_new_connection(self, conn_params):
# 每次查询都会重新建立连接
return Database.connect(**conn_params)
...
...
...
再查看其基类 BaseDatabaseWrapper
# django/db/backends/base/base.py
class BaseDatabaseWrapper:
"""Represent a database connection."""
# Mapping of Field objects to their column types.
data_types = {}
...
...
...
def _close(self