在生命周期中复用连接池
在多个请求之间复用 DB 和 HTTP 客户端。
在生命周期中复用连接池 是 CoddyKit 上的免费 MCP Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 MCP Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 MCP Academy 课程共包含 4 节课。
连接需要时间
每次调用都新建数据库或 HTTP 连接会很慢。握手会增加延迟,在高负载下很快就会累积起来。🐢
使用连接池复用连接
连接池会维护一组处于活动状态、随时可用的连接,每个请求借用一个,工作完成后再归还。
在启动时创建连接池
lifespan 钩子是最合适的位置:服务器启动时只创建一次连接池,并且要在任何工具运行之前完成。
@asynccontextmanager
async def lifespan(server):
pool = await create_pool(DSN)
yield {"pool": pool}将其作为共享状态生成
从 lifespan 中 yield 的任何内容都会成为共享上下文,因此每个处理程序都能访问同一个连接池,而无需重新创建。
通过上下文访问
在工具内部,从请求上下文中获取连接池,而不是每次都打开自己的连接。
pool = ctx.request_context.lifespan_context["pool"]借用、使用、归还
从连接池中 acquire 一个连接,运行查询,然后让它自动归还。with 代码块会处理连接的借出和释放。
async with pool.acquire() as conn:
rows = await conn.fetch(sql)限制连接池大小
设置最大大小,确保连接池打开的连接数不会超过数据库的承受能力,即使请求大量涌入也一样。
pool = await create_pool(DSN, max_size=10)同时共享一个 HTTP 客户端
HTTP 也可以采用相同的思路:在 lifespan 中创建一个 httpx 客户端并重复使用,这样连接就能保持预热并进行池化。
client = httpx.AsyncClient()
yield {"http": client}连接池是线程安全的
优秀的异步连接池专为并发而设计,能够安全地将连接分配给许多同时运行的请求。
留意连接泄漏
务必释放借用的资源。忘记归还的连接会形成泄漏,逐渐耗尽连接池,直到调用陷入停滞。
在关闭时关闭连接池
在 lifespan yield 之后,close 连接池,使服务器停止时连接能够正常释放。
yield {"pool": pool}
await pool.close()快速检查
您应在哪里创建连接池?
回顾:连接池化
您已在 lifespan 中池化连接:创建一次,通过上下文共享,每次调用时借用,并在关闭时关闭。接下来,我们将学习缓存和限流。🎯
用 AI 导师学习 Python — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 30
- 课程
- 120
常见问题解答
「在生命周期中复用连接池」课时是免费的吗?
是的 — 「在生命周期中复用连接池」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 MCP Academy 课程的其余内容,请升级到 CoddyKit PRO。 MCP Academy 课程共包含 4 节课。
「在生命周期中复用连接池」这节课中我会学到什么?
在多个请求之间复用 DB 和 HTTP 客户端。 你通过在浏览器中直接运行的动手代码来练习 MCP Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 MCP Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 MCP Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「在生命周期中复用连接池」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 MCP Academy 课中编写并运行代码吗?
能。每节 MCP Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 安全地公开 SQL 查询
- 将 REST API 封装为工具
- 在生命周期中复用连接池
- 缓存上游并限制速率