后文以django 连接mysql 为例,进行说明。
背景
django 的默认机制中,在查询时,会建立数据库连接,查询结束后,会断开数据库连接 —— 没有连接池的概念。
官方文档中描述,可以通过设置 CONN_MAX_AGE 让执行数据库查询后,不立即断开连接 —— 一定时间内保持连接,当新的查询任务在连接未断开时,可以复用此连接。这样的好处有:
避免频繁的建立连接,断开连接,消耗数据库的资源
避免大并发时,数据库连接数过多
目标:限制连接数
连接池的引入,可以在并发数高时,限制程序和数据库的连接数,避免数据库连接数太大的错误。
当django 面临高并发时,就会引发连接数过多的错误,此时我们可能会希望使用连接池(允许单个接口增加等待资源,以执行查询的时间)。
比如(特定场景):甲方给乙方提供了user_test 的账号,用于查询db_test数据库,但是限制了user_test 在 db_test 上的连接数。
此时,django 没有连接池的概念就对不上了:因为就算设置 CONN_MAX_AGE,也无法有效限制数据库连接数。
解决方案
限制线程数
方法
在通过uwsgi 部署时,可以限制单个进程中线程数,通过限制整个应用的并发量来限制对于数据库的连接。
优点
操作简单,实现方便
缺点
并发能力大大降低。因为部分请求是不会实际发生数据库操作的,对于连接数的控制不够