Django 什么时候连数据库?什么时候断?多线程时连接是共享的吗?这篇在真实的 gunicorn 下,用 PostgreSQL 的 pg_backend_pid() 和 pg_stat_activity 直接观察。
还没有任何查询时,connection.connection 是否已建立: False 每个请求里 pg_backend_pid(): [9031, 9032, 9033, 9034, 9035, 9036] 每个请求开始时 connection.connection 是 None 吗: [True, True, True, True, True, True] 请求处理线程: ['MainThread'] 请求结束后数据库端还剩多少个来自应用的连接: 0 (请求结束时连接被关闭)
用 pg_backend_pid() 看数据库端处理这条连接的后端进程:每个请求都不一样,说明每次都是新连接。请求结束时连接被关闭,数据库端只剩 0 个。
40 个请求用到的不同数据库连接(pid)数: 4 ;不同处理线程数: 4 请求全部结束后,数据库端仍保持的连接数: 4 (持久连接没有被关闭) 服务停止后数据库端连接数: 0
connection 是 connections[DEFAULT_DB_ALIAS] 的代理,内部是线程局部存储。所以「连接数 = 处理线程数(× worker 数)」——线程池的大小直接决定持久连接的上限(第 43 篇看到它的后果)。