一个请求到底占着数据库连接多久?什么写法会让连接泄漏?为什么请求里的慢调用会拖垮连接池?这篇用 pool.checkedout() 和池事件,把连接的借出与归还一步步量出来。
开始 借出的连接数 = 0 执行 select 1 借出的连接数 = 1 commit() 借出的连接数 = 0 再执行 select 1 借出的连接数 = 1 session.close() 借出的连接数 = 0 又执行 select 1(请求结束前) 借出的连接数 = 1 请求结束之后(teardown)借出的连接数 = 0 池事件顺序(checkout / checkin): ['checkout', 'checkin', 'checkout', 'checkin']
上一篇:数据库连接池;下一篇:expire_on_commit。
连续 4 次请求 /leak 的状态码: [200, 200, 500, 500] | 借出的连接数: 2 用 with 管理的 /noleak 连续 6 次: [200, 200, 200, 200, 200, 200] | 借出的连接数: 0
/hold 3 个并发请求:各自耗时 [1188, 1188, 2194] ms,总耗时 2194 ms,状态码 [200] /release 3 个并发请求:各自耗时 [1180, 1180, 1182] ms,总耗时 1182 ms,状态码 [200]
每个请求一个线程(gthread);池是 2 个连接,超时 3 秒。
视图里先查询,再返回生成器:流式响应进行中另一个请求看到的借出连接数 = 0,流结束后 = 0 生成器里(流式过程中)才查询:流式响应进行中另一个请求看到的借出连接数 = 1,流结束后 = 0